Định dạng yêu cầu không được nhận dạng cho URL bất ngờ kết thúc bằng


283

Đây không phải là một câu hỏi - đăng nó ở đây để tham khảo:

Khi sử dụng WebService, tôi đã gặp lỗi sau:

Định dạng yêu cầu không được nhận dạng cho URL bất ngờ kết thúc bằng / myMethodName


4
Để giúp Google dễ dàng hơn, bản dịch tiếng Đức của thông báo lỗi có nội dung " Unbekanntes Anforderungsformat für eine URL, die unerwartet mit '/ _myMethodName' endet. ".
Uwe Keim

Và bản dịch tiếng Trung: " 辨認 要求 , 因為 URL 未 預期 地 / myMethodName 結束。 "
Ignatius

Câu trả lời:


515

Tìm thấy một giải pháp trên trang web này

Tất cả những gì bạn cần là thêm phần sau vào web.config

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

Thông tin thêm từ Microsoft


3
i NGHINK tất cả những gì bạn cần làm là chuyển <system.web> sang <system.webserver>
roman m

tôi đã giữ nó như hiện tại và lỗi này dường như đã biến mất. nếu tôi gặp lỗi một lần nữa, tôi sẽ chuyển cấu hình dịch vụ web vào phần máy chủ web.
Daniel Brink

1
Và những gì về lỗi này được ném mà không có sự đều đặn, đôi khi? Các cuộc gọi như vậy có phụ thuộc vào một số cấu hình máy khách / trình duyệt không!?
Vladislav

2
Trên Win2012srv với IIS8, nó là cần thiết. Trên Win8 với IIS8, không cần thiết. Không có sự khác biệt nào trong cấu hình mà tôi biết.
LosManos

1
@SaurabhRai tôi cũng vậy. Điều này đã làm gì? Các liên kết được cung cấp trong câu trả lời bị hỏng.
Rod

18

Mặc dù 90% tất cả thông tin tôi tìm thấy (trong khi cố gắng tìm giải pháp cho lỗi này) bảo tôi thêm HttpGetHttpPostvào cấu hình, điều đó không hiệu quả với tôi ... và dù sao cũng không có ý nghĩa với tôi.

Ứng dụng của tôi đang chạy trên nhiều máy chủ (30+) và tôi chưa bao giờ phải thêm cấu hình này cho bất kỳ máy chủ nào. Phiên bản của ứng dụng chạy trong .NET 2.0 hoặc .NET 4.0.

Giải pháp cho tôi là đăng ký lại ASP.NET với IIS.

Tôi đã sử dụng dòng lệnh sau để đạt được điều này ...

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

Điều này đã khắc phục vấn đề của tôi. Tôi đã nhận được cùng một lỗi như OP; trên những gì đã là một trang web làm việc trước đây. Hóa ra ai đó đã kích hoạt .NET 3.5 thông qua các tính năng của windows (vì lý do không liên quan) đã phá vỡ trang web của tôi. aspnet_regiis -iĐã sửa nó.
Nate

16

Đảm bảo bạn đang sử dụng đúng phương pháp: Đăng / Nhận, đúng loại nội dung và đúng tham số (dữ liệu).

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

1
giá trị tham số của tôi chuyển có vấn đề do kiểu dữ liệu và các giá trị bị thiếu, kết quả là lỗi 500. bây giờ nó đã được giải quyết
Pranesh Janarthanan

Thêm content-type: application/jsongiải quyết vấn đề này cho tôi quá.
Delphi.Boy

10

Tuyệt vời.

Trường hợp 2 - trong đó vấn đề tương tự có thể phát sinh) trong trường hợp của tôi, vấn đề là do dòng sau:

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

Nó hoạt động tốt trong máy chủ vì các cuộc gọi được thực hiện trực tiếp đến chức năng dịch vụ web - tuy nhiên sẽ thất bại nếu bạn chạy dịch vụ trực tiếp từ .Net trong môi trường gỡ lỗi và muốn kiểm tra chạy chức năng theo cách thủ công.


Đã thêm logic đó vào web.config để ngăn định nghĩa hiển thị khi duyệt đến dịch vụ .asmx. Rõ ràng là đã phá vỡ ActiveReports. Vui mừng khi biết nó có khả năng là một triệu chứng của thử nghiệm cục bộ và nó sẽ hoạt động trên máy chủ. Cảm ơn.
Jacob Barnes

2

Đối với bản ghi tôi đã gặp lỗi này khi tôi chuyển một ứng dụng cũ từ máy chủ này sang máy chủ khác. Tôi đã thêm các <add name="HttpGet"/> <add name="HttpPost"/>yếu tố vào web.config, đã thay đổi lỗi thành:

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)

Để khắc phục lỗi này, tôi đã phải thêm các dòng ScriptHandlerFactory vào 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>

Tại sao nó hoạt động mà không có những dòng này trên một máy chủ web mà không phải là dòng khác mà tôi không biết.


1

Tôi sử dụng dòng mã sau để khắc phục vấn đề này. Viết đoạn mã sau vào tệp web.config

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

1

Tôi không gặp vấn đề khi phát triển trong localhost. Tuy nhiên, khi tôi xuất bản lên máy chủ web, dịch vụ web đã trả về kết quả trống (trống) và tôi đã thấy lỗi trong nhật ký của mình.

Tôi đã sửa nó bằng cách đặt nội dung ajax của tôi thành:

"application/json; charset=utf-8"

và sử dụng:

JSON.stringify()

trên đối tượng tôi đã đăng.

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

Tôi cũng gặp lỗi này với mod-mono apache. Có vẻ như trang tài liệu cho dịch vụ web chưa được triển khai trong linux. Nhưng dịch vụ web đang hoạt động mặc dù có lỗi này. Bạn sẽ thấy nó bằng cách thêm ?WSDLvào cuối url, tức là http: //localhost/WebService1.asmx? WSDL


1

Trong trường hợp của tôi, lỗi xảy ra khi tôi chuyển từ PC cục bộ Windows 10 sang máy chủ chuyên dụng với Windows 2012. Giải pháp cho việc thêm vào web.config các dòng sau

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

0

Trong html, bạn phải gửi cuộc gọi ở dạng aa với một GET với một cái gì đó như

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

Bạn cũng có thể sử dụng một POST với hành động là vị trí của dịch vụ web và nhập tham số thông qua thẻ đầu vào.

Ngoài ra còn có SOAPcác lớp proxy.


0

Trong trường hợp của tôi, tôi đã bị quá tải chức năng gây ra Ngoại lệ này, một khi tôi đã thay đổi tên của chức năng thứ hai thì nó chạy ổn, đoán máy chủ web không hỗ trợ quá tải chức năng


0

Trong trường hợp của chúng tôi, sự cố xảy ra do dịch vụ web được gọi bằng phương thức yêu cầu TÙY CHỌN (thay vì GET hoặc POST).

Chúng tôi vẫn không biết tại sao vấn đề đột nhiên xuất hiện. Dịch vụ web đã hoạt động được 5 năm hoàn toàn tốt trên cả HTTP và HTTPS. Chúng tôi là những người duy nhất sử dụng dịch vụ web và nó luôn sử dụng POST.

Gần đây, chúng tôi đã quyết định làm cho trang web chỉ lưu trữ dịch vụ web SSL. Chúng tôi đã thêm các quy tắc viết lại vào Web.config để chuyển đổi bất kỳ HTTP nào thành HTTPS, được triển khai và ngay lập tức bắt đầu nhận được, bên trên các yêu cầu GET và POST thông thường, các yêu cầu TÙY CHỌN. Các yêu cầu TÙY CHỌN gây ra lỗi được thảo luận trên bài đăng này.

Phần còn lại của ứng dụng hoạt động hoàn hảo. Nhưng chúng tôi tiếp tục nhận được hàng trăm báo cáo lỗi do vấn đề này.

Có một số bài đăng (ví dụ bài này ) thảo luận về cách xử lý phương thức TÙY CHỌN. Chúng tôi đã xử lý yêu cầu TÙY CHỌN trực tiếp trong Global.asax. Điều này làm cho vấn đề biến mất.

    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

Tôi đã nhận được lỗi này cho đến khi tôi thêm (như được hiển thị trong đoạn mã bên dưới) $ .keepReady (true) khi bắt đầu cuộc gọi dịch vụ web của tôi và $ .holdReady (false) sau khi kết thúc. Đây là điều jQuery tạm dừng trạng thái sẵn sàng của trang để bất kỳ tập lệnh nào trong tài liệu. Hàm đã sẵn sàng chờ đợi điều này (trong số những điều có thể khác nhưng tôi không biết).

<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

Hãy chắc chắn rằng bạn vô hiệu hóa các lỗi tùy chỉnh. Điều này có thể che giấu vấn đề ban đầu trong mã của bạn:

thay đổi

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

đến

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

-1

một WebMethod yêu cầu ContextKey,

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

khi khóa này không được đặt, có ngoại lệ.

Khắc phục bằng cách gán khóa của AutoCompleteExtender.

ac.ContextKey = "myKey";
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.