URL이 예기치 않게 끝나는 요청 형식을 인식 할 수 없습니다.


283

이것은 질문이 아닙니다-참조를 위해 여기에 게시하십시오.

WebService를 사용할 때 다음 오류가 발생했습니다.

/ myMethodName으로 예기치 않게 끝나는 URL에 대한 요청 형식을 인식 할 수 없습니다.


4
Google에서 더 쉽게 읽을 수 있도록 오류 메시지의 독일어 번역은 " URL에 대한 Unbekanntes Anforderungsformat, '/ _myMethodName'endet .
Uwe Keim

그리고 중국어 번역 : " 無法 辨認 要求 格式 , 因為 URL / 地 以 / myMethodName 結束。 "
Ignatius

답변:


515

이 웹 사이트 에서 해결책을 찾았습니다

web.config에 다음을 추가하기 만하면됩니다.

<configuration>
  <system.web>
    <webServices>
      <protocols>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
      </protocols>
    </webServices>
  </system.web>
</configuration>

Microsoft의 추가 정보


3
생각해야 할 것은 <system.web>을 <system.webserver>로 전환하는 것입니다
roman m

나는 그것을 그대로 유지했으며 현재는 오류가 사라진 것 같습니다. 오류가 다시 표시되면 웹 서비스 구성을 웹 서버 섹션으로 이동합니다.
Daniel Brink

1
이 오류가 규칙없이 발생하면 어떨까요? 이러한 통화는 일부 클라이언트 / 브라우저 구성에 따라 달라 집니까?
블라디슬라프

2
IIS8이있는 Win2012srv에서는 필요했습니다. IIS8이있는 Win8에서는 필요하지 않았습니다. 내가 아는 구성에 다른 불일치가 없습니다.
LosManos 2016 년

1
@SaurabhRai 나도. 이것은 무엇을 했습니까? 답변에 제공된 링크가 손상되었습니다.
Rod

18

모든의 90 % 내가 찾은 정보에도 불구을 추가 말해 (이 오류에 대한 해결책을 찾기 위해 노력하면서) HttpGetHttpPost나를 위해 작동하지 않았다 즉, 구성에 ... 어쨌든 나에게 이해가되지 않았다.

내 응용 프로그램이 많은 서버 (30 이상)에서 실행 중이며이 구성을 추가 할 필요가 없습니다. .NET 2.0 또는 .NET 4.0에서 실행되는 애플리케이션 버전입니다.

나를위한 해결책은 IIS에 ASP.NET을 다시 등록하는 것이 었습니다.

이것을 달성하기 위해 다음 명령 줄을 사용했습니다 ...

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i

이것은 내 문제를 해결했습니다. OP와 같은 오류가 발생했습니다. 이전에 작동했던 사이트에 대해 내 사이트를 손상시킨 Windows 기능 (관련이없는 이유로)을 통해 누군가 .NET 3.5를 사용하도록 설정했습니다. aspnet_regiis -i그래도 고쳤다.
Nate

16

올바른 방법을 사용하고 있는지 확인하십시오 : Post / Get, 올바른 컨텐츠 유형 및 올바른 매개 변수 (데이터).

$.ajax({
    type: "POST",
    url: "/ajax.asmx/GetNews",
    data: "{Lang:'tr'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (msg) { generateNews(msg); }
})

1
데이터 유형으로 인해 매개 변수 값 전달에 문제가 발생했으며 누락 된 값으로 인해 500 오류가 발생했습니다. 이제 해결되었습니다.
Pranesh Janarthanan

추가는 content-type: application/json너무 나를 위해이 문제를 해결했다.
Delphi.Boy

10

훌륭한.

사례 2-동일한 문제가 발생할 수있는 경우) 내 경우 문제는 다음 줄 때문입니다.

<webServices>
  <protocols>
    <remove name="Documentation"/>
  </protocols>
</webServices>

웹 서비스 함수를 직접 호출하면 서버에서 잘 작동하지만 디버그 환경의 .Net에서 직접 서비스를 실행하고 함수 실행을 수동으로 테스트하려는 경우 실패합니다.


.asmx 서비스를 탐색 할 때 정의가 표시되지 않도록 해당 로직을 web.config에 추가했습니다. 분명히 그것은 ActiveReports를 망쳤습니다. 로컬 테스트의 증상 일 가능성이 있으며 서버에서 작동한다는 것을 알게되어 기쁩니다. 감사.
Jacob Barnes

2

레코드의 경우 오래된 앱을 한 서버에서 다른 서버로 옮길 때이 오류가 발생했습니다. <add name="HttpGet"/> <add name="HttpPost"/>web.config에 요소를 추가 했는데 오류가 다음과 같이 변경되었습니다.

System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at BitMeter2.DataBuffer.incrementCurrent(Int64 val)
   at BitMeter2.DataBuffer.WindOn(Int64 count, Int64 amount)
   at BitMeter2.DataHistory.windOnBuffer(DataBuffer buffer, Int64 totalAmount, Int32 increments)
   at BitMeter2.DataHistory.NewData(Int64 downloadValue, Int64 uploadValue)
   at BitMeter2.frmMain.tickProcessing(Boolean fromTimerEvent)

이 오류를 해결하려면 scriptHandlerFactory 행을 web.config에 추가해야합니다.

  <system.webServer>
    <handlers>
      <remove name="ScriptHandlerFactory" />
      <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </handlers>
  </system.webServer>

왜 하나의 웹 서버 에서이 줄없이 작동했는지, 다른 웹 서버에서는 알 수 없었습니다.


1

이 문제를 해결하기 위해 다음 코드 줄을 사용합니다. web.config 파일에 다음 코드를 작성하십시오

<configuration>
    <system.web.extensions>
       <scripting>
       <webServices>
       <jsonSerialization maxJsonLength="50000000"/>
      </webServices>
     </scripting>
   </system.web.extensions>
</configuration>

1

localhost에서 개발할 때 문제가 없었습니다. 그러나 웹 서버에 게시 한 후 웹 서비스가 빈 (빈) 결과를 반환하고 로그에 오류가 표시되었습니다.

내 ajax contentType을 다음과 같이 설정하여 수정했습니다.

"application/json; charset=utf-8"

그리고 사용 :

JSON.stringify()

내가 게시 한 객체에.

var postData = {data: myData};
$.ajax({
                type: "POST",
                url: "../MyService.asmx/MyMethod",
                data: JSON.stringify(postData), 
                contentType: "application/json; charset=utf-8",
                success: function (data) {
                    console.log(data);
                },
                dataType: "json"
            });

1

또한 apache mod-mono와 함께이 오류가 발생했습니다. 웹 서비스에 대한 문서 페이지가 아직 Linux에서 구현되지 않은 것 같습니다. 그러나이 오류에도 불구하고 웹 서비스가 작동하고 있습니다. ?WSDLURL 끝에 추가하면 됩니다 (예 : http : //localhost/WebService1.asmx? WSDL).


1

내 경우에는 로컬 PC Windows 10에서 Windows 2012가있는 전용 서버로 이동할 때 오류가 발생했습니다. 해결책은 web.config에 다음 줄을 추가하는 것이 었습니다.

<webServices>
        <protocols>
               <add name="Documentation"/>
        </protocols>
</webServices>

0

html에서는 호출을 GET과 같은 형식으로 묶어야합니다.

<a href="/service/servicename.asmx/FunctionName/parameter=SomeValue">label</a>

POST웹 서비스의 위치 인 조치와 함께 a 를 사용하고 입력 태그를 통해 매개 변수를 입력 할 수도 있습니다 .

SOAP프록시 클래스 도 있습니다.


0

내 경우에는이 예외를 일으키는 함수 과부하가 발생했습니다. 두 번째 함수의 이름을 변경하면 정상적으로 실행됩니다. 웹 서버가 함수 과부하를 지원하지 않는 것 같습니다.


0

우리의 경우에는 OPTIONS 요청 메소드 (GET 또는 POST 대신)를 사용하여 웹 서비스를 호출하여 문제점이 발생했습니다.

우리는 여전히 왜 문제가 갑자기 나타 났는지 모른다. 웹 서비스는 5 년 동안 HTTP와 HTTPS 모두에서 완벽하게 실행되었습니다. 우리는 웹 서비스를 소비하는 유일한 사람이며 항상 POST를 사용합니다.

최근에 우리는 웹 서비스 SSL만을 호스팅하는 사이트를 만들기로 결정했습니다. Web.config에 다시 쓰기 규칙을 추가하여 HTTP를 HTTPS로 변환하고 배포 한 후 일반 GET 및 POST 요청 이외에 OPTIONS 요청을 즉시 가져 오기 시작했습니다. OPTIONS 요청으로 인해이 게시물에서 설명한 오류가 발생했습니다.

나머지 응용 프로그램은 완벽하게 작동했습니다. 그러나이 문제로 인해 수백 개의 오류 보고서가 계속 나타납니다.

OPTIONS 메소드를 처리하는 방법을 설명하는 여러 게시물 (예 : 게시물 ) 있습니다. Global.asax에서 직접 OPTIONS 요청을 처리했습니다. 이로 인해 문제가 사라졌습니다.

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var req = HttpContext.Current.Request;
        var resp = HttpContext.Current.Response;

        if (req.HttpMethod == "OPTIONS")
        {
            //These headers are handling the "pre-flight" OPTIONS call sent by the browser
            resp.AddHeader("Access-Control-Allow-Methods", "GET, POST");
            resp.AddHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, SOAPAction");
            resp.AddHeader("Access-Control-Max-Age", "1728000");
            resp.End();
        }
    }

0

웹 서비스 호출 시작 부분에 $ .holdReady (true) 및 종료 후 $ .holdReady (false)를 추가 할 때 까지이 오류가 발생 했습니다. 이것은 페이지의 준비 상태를 일시 중지하는 jQuery이므로 document.ready 함수 내의 모든 스크립트가이를 기다리고 있습니다 (다른 가능하지만 알려지지 않은 것들 중 하나).

<span class="AjaxPlaceHolder"></span>
<script type="text/javascript">
$.holdReady(true);
function GetHTML(source, section){
    var divToBeWorkedOn = ".AjaxPlaceHolder";
    var webMethod = "../MyService.asmx/MyMethod";
    var parameters = "{'source':'" + source + "','section':'" + section + "'}";

    $.ajax({
        type: "POST",
        url: webMethod,
        data: parameters,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: true,
        xhrFields: {
            withCredentials: false
        },
        crossDomain: true,
        success: function(data) {
            $.holdReady(false);
            var myData = data.d;
            if (myData != null) {
                $(divToBeWorkedOn).prepend(myData.html);
            }
        },
        error: function(e){
            $.holdReady(false);
            $(divToBeWorkedOn).html("Unavailable");
        }
    });
}
GetHTML("external", "Staff Directory");
</script>

-1

사용자 정의 오류를 비활성화하십시오. 이것은 코드의 원래 문제를 숨길 수 있습니다.

변화

<customErrors defaultRedirect="~/Error" mode="On">

<customErrors defaultRedirect="~/Error" mode="Off">

-1

ContextKey가 필요한 WebMethod

[WebMethod]
public string[] GetValues(string prefixText, int count, string contextKey)

이 키를 설정하지 않으면 예외가 발생합니다.

AutoCompleteExtender의 키를 할당하여 수정했습니다.

ac.ContextKey = "myKey";
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.