programing

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

newstyles 2023. 5. 24. 21:46

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

웹 서비스를 사용할 때 다음 오류가 발생했습니다.

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

어떻게 이것을 해결할 수 있습니까?

사이트에서 솔루션을 찾았습니다.

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

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

Microsoft의 추가 정보

(오류에 가 찾은 의 90%에도 , (으)ㄹ .HttpGet그리고.HttpPost안 됐어요어쨌든 이해가 안 됐어요

응용프로그램이 많은 서버(30개 이상)에서 실행되고 있으며, 이 구성을 서버에 추가할 필요가 없습니다..NET 2.0 또는 .NET 4.0에서 실행되는 응용 프로그램의 버전입니다.

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

이를 위해 다음 명령줄을 사용했습니다.

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

올바른 방법인 게시/받기, 올바른 콘텐츠 유형 및 올바른 매개 변수(데이터)를 사용하고 있는지 확인합니다.

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

훌륭합니다.

사례 2 - 동일한 문제가 발생할 수 있는 경우)의 경우 다음 행으로 인해 문제가 발생했습니다.

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

웹 서비스 기능에 직접 호출되므로 서버에서 잘 작동하지만 에서 직접 서비스를 실행하면 실패합니다.디버그 환경에 네트를 치고 수동으로 기능을 실행하려고 합니다.

참고로 오래된 앱을 한 서버에서 다른 서버로 이동했을 때 이 오류가 발생했습니다.는 습다니했가를 했습니다.<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>

왜 한 웹 서버에서는 이러한 줄 없이 작동했고 다른 웹 서버에서는 작동하지 않았는지 모르겠습니다.

이 경우 로컬 PC Windows 10에서 Windows 2012가 설치된 전용 서버로 이동할 때 오류가 발생했습니다.의 솔루션은 web.config에 다음 행을 추가하는 것이었습니다.

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

저는 이 문제를 해결하기 위해 다음 줄의 코드를 사용합니다.web.config 파일에 다음 코드를 기록합니다.

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

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

아약스 콘텐츠를 설정하여 수정했습니다.입력 대상:

"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"
            });

mod-monoapache mod-mono에서 이 했습니다.리눅스에서는 웹 서비스에 대한 설명서 페이지가 아직 구현되지 않은 것 같습니다.하지만 이 오류에도 불구하고 웹 서비스는 작동하고 있습니다.다음을 추가하여 확인해야 합니다.?WSDLurl 끝에 http://localhost/WebService1.asmx?WSDL

HTML에서 당신은 GET와 같은 형식으로 통화를 동봉해야 합니다.

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

은 또한 수있다습니도를 할 수 .POST작업은 웹 서비스의 위치이며 입력 태그를 통해 매개 변수를 입력합니다.

▁are▁there습도 있습니다.SOAP및 프록시 클래스.

나의 경우 이 예외를 유발하는 기능의 오버로드가 있었습니다. 두 번째 기능의 이름을 변경한 후 실행되었습니다. 웹 서버가 기능 오버로드를 지원하지 않는 것으로 추측합니다.

컨텍스트 키가 필요한 웹 메서드,

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

이 키가 설정되지 않은 경우 예외가 발생했습니다.

자동 완성을 할당하여 수정Extender 키입니다.

ac.ContextKey = "myKey";

이 경우 GET 또는 POST 대신 OPTIONS 요청 방법을 사용하여 웹 서비스를 호출하여 문제가 발생했습니다.

우리는 왜 갑자기 문제가 생겼는지 아직도 모릅니다.웹 서비스는 HTTP와 HTTPS 모두에서 완벽하게 5년 동안 실행되었습니다.우리는 웹 서비스를 소비하는 유일한 사람이며 항상 POST를 사용합니다.

최근에 우리는 웹 서비스를 호스팅하는 사이트를 SSL로만 만들기로 결정했습니다.우리는 HTTP를 HTTPS로 변환하기 위해 Web.config에 다시 쓰기 규칙을 추가했고, 배포했으며, 정기적인 GET 및 POST 요청 위에 OPTIONS 요청을 즉시 받기 시작했습니다.OPTIONS 요청으로 인해 이 게시물에서 논의된 오류가 발생했습니다.

나머지 애플리케이션은 완벽하게 잘 작동했습니다.하지만 우리는 이 문제로 인해 수백 건의 오류 보고를 받았습니다.

OPTIONS 방법을 다루는 방법을 논의하는 여러 게시물(: 이 게시물)이 있습니다.우리는 OPTIONS 요청을 Global.asax에서 직접 처리했습니다.이것은 그 문제를 사라지게 했습니다.

    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();
        }
    }

웹 서비스 호출 시작 시 $.holdReady(true)를 추가하고 종료 후 $.holdReady(false)를 추가할 때까지 이 오류가 발생했습니다.이것은 페이지의 준비 상태를 일시 중단하여 document.ready 함수 내의 스크립트가 이를 기다리고 있도록 하는 jQuery입니다(다른 가능성은 있지만 제가 알 수 없는 것들 중에서).

<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>

사용자 지정 오류를 사용하지 않도록 설정해야 합니다.이렇게 하면 코드의 원래 문제를 가릴 수 있습니다.

바꾸다

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

로.

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

언급URL : https://stackoverflow.com/questions/657313/request-format-is-unrecognized-for-url-unexpectedly-ending-in