Ini bukan pertanyaan - mempostingnya di sini untuk referensi:
Saat mengkonsumsi WebService, saya mendapat kesalahan berikut:
Format permintaan tidak dikenali untuk URL yang secara tak terduga berakhir di / myMethodName
Ini bukan pertanyaan - mempostingnya di sini untuk referensi:
Saat mengkonsumsi WebService, saya mendapat kesalahan berikut:
Format permintaan tidak dikenali untuk URL yang secara tak terduga berakhir di / myMethodName
Jawaban:
Menemukan solusi di situs web ini
Yang Anda butuhkan adalah menambahkan yang berikut ke web.config Anda
<configuration>
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
</system.web>
</configuration>
Info lebih lanjut dari Microsoft
Meskipun 90% dari semua informasi yang saya temukan (ketika mencoba menemukan solusi untuk kesalahan ini) mengatakan kepada saya untuk menambahkan HttpGet
dan HttpPost
ke konfigurasi, itu tidak bekerja untuk saya ... dan bagaimanapun juga tidak masuk akal bagi saya.
Aplikasi saya berjalan di banyak server (30+) dan saya belum pernah menambahkan konfigurasi ini untuk mereka. Baik versi aplikasi yang berjalan di bawah .NET 2.0 atau .NET 4.0.
Solusi bagi saya adalah mendaftar ulang ASP.NET terhadap IIS.
Saya menggunakan baris perintah berikut untuk mencapai ini ...
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i
aspnet_regiis -i
memperbaikinya.
Pastikan Anda menggunakan metode yang tepat: Posting / Dapatkan, jenis konten yang tepat dan parameter (data) yang tepat.
$.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
memecahkan masalah ini untuk saya juga.
Hebat.
Kasus 2 - di mana masalah yang sama dapat muncul) dalam kasus saya masalahnya adalah karena baris berikut:
<webServices>
<protocols>
<remove name="Documentation"/>
</protocols>
</webServices>
Ini bekerja dengan baik di server karena panggilan dilakukan langsung ke fungsi layanan web - namun akan gagal jika Anda menjalankan layanan langsung dari .Net di lingkungan debug dan ingin menguji menjalankan fungsi secara manual.
Sebagai catatan saya mendapatkan kesalahan ini ketika saya memindahkan aplikasi lama dari satu server ke yang lain. Saya menambahkan <add name="HttpGet"/> <add name="HttpPost"/>
elemen ke web.config, yang mengubah kesalahan menjadi:
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)
Untuk memperbaiki kesalahan ini, saya harus menambahkan baris ScriptHandlerFactory ke 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>
Mengapa itu bekerja tanpa garis-garis ini pada satu server web dan bukan yang lain saya tidak tahu.
Saya menggunakan baris kode berikut untuk memperbaiki masalah ini. Tulis kode berikut dalam file web.config
<configuration>
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="50000000"/>
</webServices>
</scripting>
</system.web.extensions>
</configuration>
Saya tidak memiliki masalah ketika berkembang di localhost. Namun, begitu saya menerbitkan ke server web, layanan web mengembalikan hasil kosong (kosong) dan saya melihat kesalahan dalam log saya.
Saya memperbaikinya dengan mengatur ajax contentType saya ke:
"application/json; charset=utf-8"
dan menggunakan:
JSON.stringify()
pada objek yang saya posting.
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"
});
Saya juga mendapatkan kesalahan ini dengan apache mod-mono. Sepertinya halaman dokumentasi untuk layanan web belum diimplementasikan di linux. Tetapi layanan web berfungsi meskipun ada kesalahan ini. Anda harus melihatnya dengan menambahkan ?WSDL
di akhir url, yaitu http: //localhost/WebService1.asmx? WSDL
Dalam kasus saya kesalahan terjadi ketika saya pindah dari PC Windows 10 lokal saya ke server khusus dengan Windows 2012. Solusi untuk adalah menambahkan ke web.config baris berikut
<webServices>
<protocols>
<add name="Documentation"/>
</protocols>
</webServices>
Dalam html Anda harus melampirkan panggilan dalam bentuk dengan GET dengan sesuatu seperti
<a href="/service/servicename.asmx/FunctionName/parameter=SomeValue">label</a>
Anda juga dapat menggunakan a POST
dengan tindakan menjadi lokasi layanan web dan memasukkan parameter melalui tag input.
Ada juga SOAP
kelas dan proxy.
Dalam kasus saya, saya memiliki kelebihan fungsi yang menyebabkan pengecualian ini, setelah saya mengubah nama fungsi kedua saya berjalan ok, tebak server web tidak mendukung kelebihan fungsi
Dalam kasus kami masalahnya disebabkan oleh layanan web yang dipanggil menggunakan metode permintaan OPSI (bukan GET atau POST).
Kami masih belum tahu mengapa masalah tiba-tiba muncul. Layanan web telah berjalan selama 5 tahun dengan sangat baik melalui HTTP dan HTTPS. Kami adalah satu-satunya yang mengkonsumsi layanan web dan selalu menggunakan POST.
Baru-baru ini kami memutuskan untuk membuat situs yang hanya menyelenggarakan layanan web SSL. Kami menambahkan aturan penulisan ulang ke Web.config untuk mengubah HTTP apa pun menjadi HTTPS, digunakan, dan segera mulai mendapatkan, di atas permintaan GET dan POST biasa, permintaan OPSI. Permintaan OPSI menyebabkan kesalahan yang dibahas pada posting ini.
Sisa aplikasi bekerja dengan sangat baik. Tetapi kami terus mendapatkan ratusan laporan kesalahan karena masalah ini.
Ada beberapa posting (misalnya yang ini ) yang membahas bagaimana menangani metode OPSI. Kami pergi untuk menangani permintaan OPSI langsung di Global.asax. Ini membuat masalah menghilang.
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();
}
}
Saya mendapatkan kesalahan ini sampai saya menambahkan (seperti yang ditunjukkan dalam kode di bawah) $ .holdReady (true) di awal panggilan layanan web saya dan $ .holdReady (false) setelah itu berakhir. Ini adalah hal jQuery untuk menangguhkan status halaman yang siap sehingga skrip dalam dokumen. Sudah berfungsi akan menunggu untuk ini (di antara hal-hal lain yang mungkin tetapi tidak saya ketahui).
<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>
Pastikan Anda menonaktifkan kesalahan khusus. Ini dapat menutupi masalah asli dalam kode Anda:
perubahan
<customErrors defaultRedirect="~/Error" mode="On">
untuk
<customErrors defaultRedirect="~/Error" mode="Off">