2012-08-16 14 views
7

Ho jquery chiamare un webservice asp.net con un numero intero. Sulla nostra applicazione legacy portata a .net 4.0 Non riesco a far funzionare questa chiamata. posso chiamare un metodo che non ha parametri, ma l'invio dei dati al metodo Web restituisce il seguente errore:jQuery Ajax verso asp.net servizio web asmx Il formato richiesta non è valido: application/jones

System.InvalidOperationException: Request format is invalid: application/json; charset=UTF-8. 
at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters() 
at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest() 

ho creato esattamente lo stesso codice in un progetto vuoto e ha funzionato bene. Non riuscivo a vedere nulla nel web.config aggiunto dal progetto vuoto che avrebbe fatto la differenza.

il codice jQuery

$.ajax({ 
    type: "POST", 
    url: "/WebService1.asmx/Test", 
    data: JSON.stringify({"code": 1234}), 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function (msg) { 
     alert(msg); 
    } 
}); 

My Code Web Service

<ScriptService()> _ 
<WebService(Namespace:="http://tempuri.org/")> _ 
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ 
<ToolboxItem(False)> _ 
Public Class WebService1 
    Inherits WebService 

    <WebMethod()> 
    Public Function Test(ByVal code As Integer) As String 
     Return "success" 
    End Function 

    <WebMethod()> 
    Public Function Hello() As String 
     Return "hello" 
    End Function  
End Class 

Web Config

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <appSettings> 
    </appSettings> 
    <connectionStrings> 
    </connectionStrings> 
    <system.web> 
     <httpRuntime enableVersionHeader="false" /> 
     <httpCookies httpOnlyCookies="true" requireSSL="false" lockItem="true" /> 
     <trace enabled="false" pageOutput="true" requestLimit="40" localOnly="true"/> 

     <httpModules> 
     </httpModules> 
     <compilation debug="true" strict="true" explicit="true" targetFramework="4.0"> 

     </compilation> 
     <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"> 
     </pages> 

     <authentication mode="Forms"> 

     <httpHandlers>  
     </httpHandlers> 
    </system.web> 

    <system.webServer> 

    <validation validateIntegratedModeConfiguration="false" /> 
    <modules> 
    </modules> 
    <handlers> 
    </handlers> 
    <httpErrors errorMode="Custom" > 
    </httpErrors> 
    </system.webServer> 
</configuration> 
+0

Potresti pubblicare il tuo file web.config? So dove si trova il problema, ho solo bisogno di una conferma prima di pubblicare la risposta. –

+0

@DarinDimitrov Ho aggiunto il web.config ma ho rimosso i dati sensibili – skyfoot

risposta

10

DOH, stavo lavorando nel web.config sbagliata.

Come molte domande su SO, la soluzione era aggiungere quanto segue.

<system.webServer> 
     <handlers> 
      <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" /> 
      <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     </handlers> 
    </system.webServer> 
+0

Grazie. Risolto il mio problema Ma puoi spiegare cosa fa. Nel mio caso è specifico per una macchina. Qualche idea Qual è la ragione? E quale potrebbe essere la soluzione se non voglio cambiare il mio file di configurazione perché funziona bene su un'altra macchina. – Akie

+0

Sono contento che stiate lavorando nel web.config sbagliato e avete posto domande e risposte. Questo mi ha fatto risparmiare molto tempo. –

+0

@Akie Anche io non sono sicuro, ma quello che posso dirti è che ScriptHandlerFactory aggiungerà i tuoi WebServices al tuo codice JavaScript come riferimenti al momento della compilazione. Ciò significa che puoi chiamare direttamente i WebMethods nei tuoi WebServices, tramite la sintassi 'namespace.class.method' in JavaScript. Tuttavia, questo è il posto in cui sono confuso, quindi non posso dare alcuna risposta al riguardo. –

9

Ho avuto lo stesso problema e finire l'esecuzione di questo comando ...

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

Nota che sarà necessario il prompt dei comandi in modalità amministratore per farlo funzionare.

Problemi correlati