Đâ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
Đâ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
Câu trả lời:
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
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 HttpGet
và HttpPost
và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
aspnet_regiis -i
Đã sửa nó.
Đả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); }
})
content-type: application/json
giải quyết vấn đề này cho tôi quá.
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.
Đố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.
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>
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"
});
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 ?WSDL
vào cuối url, tức là http: //localhost/WebService1.asmx? WSDL
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>
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ó SOAP
các lớp proxy.
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
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();
}
}
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>
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">