Format permintaan tidak dikenali untuk URL yang berakhir dengan tak terduga

283

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

roman m
sumber
4
Untuk memudahkan Google, terjemahan bahasa Jerman dari pesan kesalahan bertuliskan " Unbekanntes Anforderungsformat für eine URL, die unerwartet mit '/ _myMethodName' endet. ".
Uwe Keim
Dan terjemahan bahasa Mandarin: " 無法 辨認 要求 格式 , 因為 URL 未 預期 地 以 / myMethodName 結束。 "
Ignatius

Jawaban:

515

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

roman m
sumber
3
Saya pikir yang perlu Anda lakukan adalah beralih <system.web> ke <system.webserver>
roman m
saya menyimpannya apa adanya dan untuk saat ini kesalahan tampaknya telah hilang. jika saya melihat kesalahan lagi saya akan memindahkan konfigurasi layanan web ke bagian server web.
Daniel Brink
1
Dan bagaimana jika kesalahan ini dilemparkan tanpa keteraturan, hanya kadang-kadang? Apakah panggilan seperti itu tergantung pada beberapa konfigurasi klien / browser !?
Vladislav
2
Pada Win2012srv dengan IIS8 dibutuhkan. Pada Win8 dengan IIS8 itu tidak diperlukan. Tidak ada perbedaan dalam konfigurasi yang saya tahu.
LosManos
1
@SaurabhRai aku juga. Apa yang dilakukan ini? Tautan yang disediakan dalam jawaban terputus.
Rod
18

Meskipun 90% dari semua informasi yang saya temukan (ketika mencoba menemukan solusi untuk kesalahan ini) mengatakan kepada saya untuk menambahkan HttpGetdan HttpPostke 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
terjun bebas
sumber
Ini memperbaiki masalah saya. Saya mendapatkan kesalahan yang sama dengan OP; di situs yang sebelumnya berfungsi. Ternyata seseorang mengaktifkan fitur .NET 3.5 melalui windows (untuk alasan yang tidak terkait) yang merusak situs saya. aspnet_regiis -imemperbaikinya.
Nate
16

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); }
})
HasanG
sumber
1
Melewati nilai parameter saya mendapat masalah karena datatype, dan nilai yang hilang, yang berakhir pada 500 kesalahan. sekarang sudah terpecahkan.
Pranesh Janarthanan
Tambahkan content-type: application/jsonmemecahkan masalah ini untuk saya juga.
Delphi.Boy
10

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.

Kalpesh Popat
sumber
Menambahkan logika itu ke web.config untuk mencegah definisi menampilkan saat menjelajah ke layanan .asmx. Tampaknya itu merusak ActiveReports. Senang mengetahui itu kemungkinan merupakan gejala pengujian lokal dan itu akan bekerja pada server. Terima kasih.
Jacob Barnes
2

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.

Sprintstar
sumber
1

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>
pankaj prajapati
sumber
1

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"
            });
Jason Williams
sumber
1

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 ?WSDLdi akhir url, yaitu http: //localhost/WebService1.asmx? WSDL

10pan
sumber
1

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>
Ruby Kousinovali
sumber
0

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 POSTdengan tindakan menjadi lokasi layanan web dan memasukkan parameter melalui tag input.

Ada juga SOAPkelas dan proxy.

Dave
sumber
0

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

Amir Shrestha
sumber
0

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

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>
bestinamir
sumber
-1

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">
Milan de Jong
sumber
-1

sebuah WebMethod yang membutuhkan ContextKey,

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

ketika kunci ini tidak diatur, dapatkan pengecualian.

Memperbaikinya dengan menetapkan kunci AutoCompleteExtender.

ac.ContextKey = "myKey";
Rm558
sumber