URL ile beklenmedik bir şekilde biten URL için istek biçimi tanınmıyor


283

Bu bir soru değil - referans için buraya gönderme:

Bir Web Hizmeti kullanırken, aşağıdaki hatayı aldım:

/ MyMethodName ile beklenmedik şekilde biten URL için istek biçimi tanınmıyor


4
Google için kolaylaştırmak için, hata iletisinin Almanca çevirisi " Unbekanntes Anforderungsformat für eine URL, die unerwartet mit '/ _myMethodName' endet " yazıyor .
Uwe Keim

Ve Çince çeviri: " 無法 辨認 要求 格式 , 因為 URL 未 預期 地 以 / myMethodName 結束。 "
Ignatius

Yanıtlar:


515

Bu web sitesinde bir çözüm bulundu

İhtiyacınız olan tek şey aşağıdakileri web.config dosyasına eklemektir

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

Microsoft'tan daha fazla bilgi


3
i tüm yapmanız gereken <system.web> 'ı <system.webserver> olarak değiştirmek
roman m

i olduğu gibi tuttu ve şimdilik hata gitti gibi görünüyor. hatayı tekrar görürsem webservices yapılandırmalarını web sunucusu bölümüne taşıyacağım.
Daniel Brink

1
Ve eğer bu hata herhangi bir düzenlilik olmadan atılırsa, bazen? Bu tür çağrılar bazı istemci / tarayıcı yapılandırmasına bağlı mı !?
Vladislav

2
IIS8 içeren bir Win2012srv'de gerekliydi. IIS8 içeren bir Win8'de gerekli değildi. Bildiğim yapılandırmada başka hiçbir tutarsızlık yok.
LosManos

1
@SaurabhRai de beni. Bu ne yaptı? Cevapta verilen bağlantılar kopmuştur.
Rod

18

Bulduğum tüm bilgilerin% 90'ına rağmen (bu hataya bir çözüm bulmaya çalışırken) bana HttpGetve HttpPostyapılandırmaya eklememi söyledi, bu benim için işe yaramadı ... ve yine de bana mantıklı gelmedi.

Uygulamam çok sayıda sunucuda (30+) çalışıyor ve bu yapılandırmayı hiçbir zaman eklemek zorunda kalmadım. .NET 2.0 veya .NET 4.0 altında çalışan uygulamanın sürümü.

Benim için çözüm ASP.NET'i IIS'ye yeniden kaydetmekti.

Bunu başarmak için aşağıdaki komut satırını kullandım ...

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

Bu benim sorunumu çözdü. OP ile aynı hatayı alıyordum; Daha önce çalışan bir site hakkında. Sitemi bozan Windows özellikleri (ilgisiz nedenlerle) aracılığıyla .NET 3.5'in etkin olduğu birileri ortaya çıkıyor. aspnet_regiis -iolsa düzeltildi.
Nate

16

Doğru yöntemi kullandığınızdan emin olun: Gönder / Al, doğru içerik türü ve doğru parametreler (veriler).

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

1
benim parametre değeri geçen veri türü ve 500 hata ile sonuçlanan eksik değerleri nedeniyle sorun var. şimdi çözüldü.
Pranesh Janarthanan

Ekle content-type: application/jsonde benim için bu sorunu çözdü.
Delphi.Boy

10

Süper.

Durum 2 - aynı sorunun ortaya çıkabileceği yer) benim durumumda sorun şu satırdan kaynaklanıyordu:

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

Çağrılar doğrudan web hizmeti işlevine yapıldığından sunucuda iyi çalışır - ancak hizmeti doğrudan hata ayıklama ortamında .Net'ten çalıştırırsanız ve işlevi manuel olarak çalıştırmayı test etmek isterseniz başarısız olur.


.Asmx hizmetine göz atarken tanımın görüntülenmesini önlemek için bu mantığı web.config dosyasına ekledi. Görünüşe göre bu ActiveReports'u kırdı. Büyük olasılıkla yerel test belirtisi olduğunu ve sunucuda çalışacağını bilmek sevindim. Teşekkürler.
Jacob Barnes

2

Kayıt için eski bir uygulamayı bir sunucudan diğerine taşıdığımda bu hatayı alıyordum. <add name="HttpGet"/> <add name="HttpPost"/>Hatayı şu şekilde değiştiren öğeleri web.config dosyasına ekledim :

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)

Bu hatayı düzeltmek için web.config dosyasına ScriptHandlerFactory satırlarını eklemek zorunda kaldım:

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

Neden bu satırlar olmadan bir web sunucusunda çalıştı, diğerini bilmiyorum.


1

Bu sorunu gidermek için aşağıdaki kod satırını kullanın. Web.config dosyasına aşağıdaki kodu yazın

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

1

Yerel ana bilgisayar geliştirirken sorun yaşamadım. Ancak, bir kez bir web sunucusunda yayınladı, webservice boş (boş) bir sonuç döndürüyordu ve günlüklerimde hata görüyordum.

Benim ajax contentType ayarlayarak düzeltildi:

"application/json; charset=utf-8"

ve kullanma:

JSON.stringify()

yayınladığım nesne üzerinde.

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

Benim durumumda, yerel bilgisayarım Windows 10'dan Windows 2012 ile özel bir sunucuya taşındığımda hata oluştu. Bunun çözümü web'e eklemekti. Aşağıdaki satırları yapılandır

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

0

HTML'de çağrıyı aa formuna GET ile benzer bir şeyle

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

Ayrıca POSTeylemi web hizmetinin konumu olarak a ile kullanabilir ve parametreyi bir giriş etiketi aracılığıyla girebilirsiniz.

Ayrıca SOAPve proxy sınıfları da vardır.


0

Benim durumumda, bu İstisnaya neden olan fonksiyonun aşırı yüklenmesi vardı, ikinci fonksiyonumun adını değiştirdikten sonra tamam, sanırım web sunucusu fonksiyon aşırı yüklemesini desteklemiyor


0

Bizim durumumuzda sorun, OPTIONS istek yöntemi kullanılarak çağrılan web hizmetinden kaynaklandı (GET veya POST yerine).

Sorunun neden aniden ortaya çıktığını hala bilmiyoruz. Web hizmeti hem HTTP hem de HTTPS üzerinden 5 yıldır mükemmel bir şekilde çalışıyor. Biz web hizmetini tüketen sadece biziz ve her zaman POST kullanıyor.

Kısa bir süre önce yalnızca web hizmetini barındıran siteyi SSL yapmaya karar verdik. HTTP'yi HTTPS'ye dönüştürmek, dağıtmak ve hemen normal GET ve POST istekleri, OPTIONS istekleri üzerine almak için Web.config dosyasına yeniden yazma kuralları ekledik. OPTIONS istekleri bu yayında tartışılan hataya neden oldu.

Uygulamanın geri kalanı mükemmel çalıştı. Ancak bu sorun nedeniyle yüzlerce hata raporu almaya devam ettik.

SEÇENEKLER yönteminin nasıl ele alınacağını tartışan birkaç yazı (örneğin bu ) vardır. OPTIONS isteğini doğrudan Global.asax'ta ele almaya gittik. Bu problemi ortadan kaldırdı.

    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

(Aşağıdaki kodda gösterildiği gibi) ekledim kadar bu hatayı başlamıştı (doğru) $ .holdReady benim web hizmeti çağrısı ve başında $ .holdReady (yanlış) sona erdiğinde. Bu jQuery şey sayfanın hazır durumunu askıya böylece belge.ready fonksiyonu içindeki herhangi bir komut dosyası (diğer olası yanı sıra benim için bilinmeyen şeyler) bekliyor olacak.

<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

Özel hataları devre dışı bıraktığınızdan emin olun. Bu, kodunuzdaki orijinal sorunu maskeleyebilir:

değişiklik

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

için

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

-1

bir ContextKey gerektiren bir WebMethod,

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

bu tuş ayarlanmadığında, istisnayı yakalayın.

AutoCompleteExtender anahtarını atayarak düzeltme.

ac.ContextKey = "myKey";
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.