Il formato della richiesta non è riconosciuto per l'URL che termina inaspettatamente


283

Questa non è una domanda: pubblicala qui come riferimento:

Durante l'utilizzo di un servizio Web, ho riscontrato il seguente errore:

Il formato della richiesta non è riconosciuto per l'URL che termina inaspettatamente in / myMethodName


4
Per facilitare Google, la traduzione tedesca del messaggio di errore dice " Unbekanntes Anforderungsformat für eine URL, die unerwartet mit '/ _myMethodName' endet ".
Uwe Keim,

E la traduzione cinese: " 無法 辨認 要求 格式 , 因為 URL 未 預期 地 以 / myMethodName 結束。 "
Ignazio

Risposte:


515

Ho trovato una soluzione su questo sito

Tutto ciò che serve è aggiungere quanto segue al tuo web.config

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

Ulteriori informazioni da Microsoft


3
PENSO che tutto ciò che devi fare è passare da <system.web> a <system.webserver>
roman m

l'ho tenuto così com'è e per ora l'errore sembra essere scomparso. se vedo di nuovo l'errore sposterò le configurazioni di webservices nella sezione webserver.
Daniel Brink,

1
E se questo errore viene generato senza alcuna regolarità, solo a volte? Tali chiamate dipendono da alcune configurazioni client / browser !?
Vladislav,

2
Su Win2012srv con IIS8 era necessario. Su una Win8 con IIS8 non era necessario. Nessuna altra discrepanza nella configurazione che conosco.
LosManos,

1
@SaurabhRai anche a me. Che cosa ha fatto? I collegamenti forniti nella risposta sono interrotti.
Rod

18

Nonostante il 90% di tutte le informazioni che ho trovato (mentre cercavo di trovare una soluzione a questo errore) mi dicesse di aggiungere il HttpGete HttpPostalla configurazione, ciò non ha funzionato per me ... e comunque non ha avuto senso per me.

La mia applicazione è in esecuzione su molti server (oltre 30) e non ho mai dovuto aggiungere questa configurazione per nessuno di essi. La versione dell'applicazione in esecuzione in .NET 2.0 o .NET 4.0.

La soluzione per me era quella di registrare nuovamente ASP.NET su IIS.

Ho usato la seguente riga di comando per ottenere questo ...

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

Questo risolto il mio problema. Stavo ottenendo lo stesso errore di OP; su quello che era stato un sito precedentemente funzionante. Risulta che qualcuno ha abilitato .NET 3.5 attraverso le funzionalità di Windows (per ragioni non correlate) che hanno rotto il mio sito. aspnet_regiis -irisolto però.
Nate,

16

Assicurati di utilizzare il metodo giusto: Pubblica / Ricevi, giusto tipo di contenuto e parametri corretti (dati).

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

1
il passaggio del valore del mio parametro ha avuto problemi a causa del tipo di dati e dei valori mancanti, che finiscono con un errore di 500. ora è risolto.
Pranesh Janarthanan,

Aggiungi content-type: application/jsonrisolto questo problema anche per me.
Delphi.Boy

10

Superba.

Caso 2 - dove può risolvere lo stesso problema) nel mio caso il problema era dovuto alla seguente riga:

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

Funziona bene nel server poiché le chiamate vengono effettuate direttamente alla funzione webservice - tuttavia non funzionerà se si esegue il servizio direttamente da .Net nell'ambiente di debug e si desidera testare l'esecuzione manuale della funzione.


Aggiunta quella logica a web.config per impedire la visualizzazione della definizione quando si accede al servizio .asmx. Apparentemente questo ha rotto ActiveReports. Sono contento di sapere che è probabilmente un sintomo del test locale e funzionerà sul server. Grazie.
Jacob Barnes,

2

Per la cronaca, ho riscontrato questo errore quando ho spostato una vecchia app da un server a un altro. Ho aggiunto gli <add name="HttpGet"/> <add name="HttpPost"/>elementi a web.config, che ha modificato l'errore in:

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)

Per correggere questo errore ho dovuto aggiungere le righe ScriptHandlerFactory a 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>

Perché non ha funzionato senza queste linee su un web server e non sull'altro non lo so.


1

Uso la seguente riga di codice per risolvere questo problema. Scrivi il seguente codice nel file web.config

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

1

Non ho avuto il problema durante lo sviluppo in localhost. Tuttavia, una volta pubblicato su un server Web, il servizio web stava restituendo un risultato vuoto (vuoto) e vedevo l'errore nei miei registri.

L'ho risolto impostando il mio contenuto AjaxType su:

"application/json; charset=utf-8"

e usando:

JSON.stringify()

sull'oggetto che stavo postando.

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

Ho anche riscontrato questo errore con apache mod-mono. Sembra che la pagina della documentazione per webservice non sia ancora implementata in Linux. Ma il servizio web funziona nonostante questo errore. Dovresti vederlo aggiungendo ?WSDLalla fine di url, ovvero http: //localhost/WebService1.asmx? WSDL


1

Nel mio caso l'errore si è verificato quando mi sono spostato dal mio PC locale Windows 10 a un server dedicato con Windows 2012. La soluzione era aggiungere al web.config le seguenti righe

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

0

In html devi racchiudere la chiamata in un modulo con un GET con qualcosa di simile

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

Puoi anche usare a POST con l'azione come posizione del servizio Web e immettere il parametro tramite un tag di input.

Esistono anche SOAPclassi proxy.


0

Nel mio caso ho avuto un sovraccarico di funzione che stava causando questa eccezione, una volta cambiato il nome della mia seconda funzione ha funzionato bene, suppongo che il server Web non supporti il ​​sovraccarico della funzione


0

Nel nostro caso il problema è stato causato dalla chiamata del servizio Web tramite il metodo di richiesta OPTIONS (anziché GET o POST).

Non sappiamo ancora perché il problema sia apparso all'improvviso. Il servizio Web è in esecuzione da 5 anni perfettamente su HTTP e HTTPS. Siamo gli unici che consumano il servizio web e utilizza sempre POST.

Di recente abbiamo deciso di rendere SSL solo il sito che ospita il servizio web. Abbiamo aggiunto regole di riscrittura a Web.config per convertire qualsiasi cosa HTTP in HTTPS, distribuito e abbiamo immediatamente iniziato a ricevere, oltre alle normali richieste GET e POST, le richieste OPTIONS. Le richieste OPTIONS hanno causato l'errore discusso in questo post.

Il resto dell'applicazione ha funzionato perfettamente. Ma abbiamo continuato a ricevere centinaia di segnalazioni di errori a causa di questo problema.

Esistono diversi post (ad esempio, questo ) che discutono su come gestire il metodo OPTIONS. Siamo andati a gestire la richiesta OPTIONS direttamente in Global.asax. Questo ha fatto sparire il problema.

    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

Stavo ricevendo questo errore fino a quando non ho aggiunto (come mostrato nel codice seguente) $ .holdReady (true) all'inizio della mia chiamata al servizio web e $ .holdReady (false) al termine. Questa è la cosa di jQuery per sospendere lo stato pronto della pagina in modo che qualsiasi script all'interno di document.ready funzioni sia in attesa di questo (tra le altre cose possibili ma a me sconosciute).

<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

Assicurati di disabilitare gli errori personalizzati. Questo può mascherare il problema originale nel tuo codice:

modificare

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

per

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

-1

un WebMethod che richiede un ContextKey,

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

quando questa chiave non è impostata, ha ottenuto l'eccezione.

Risolvendolo assegnando la chiave AutoCompleteExtender.

ac.ContextKey = "myKey";
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.