2012-08-16 16 views
7

Tengo jquery llame a un servicio web asp.net con un número entero. En nuestra aplicación de legacia, que fue portada a .net 4.0, no puedo hacer que funcione esta llamada. puedo llamar a un método que no tiene parámetros, pero el envío de datos al método Web devuelve el siguiente error:jQuery Ajax a asp.net servicio web de asmx lanza El formato de solicitud no es válido: application/json

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

creé exactamente el mismo código en un proyecto en blanco y funcionó bien. No pude ver nada en la web. Estoy seguro de que el proyecto en blanco agregó que marcaría la diferencia.

Código 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); 
    } 
}); 

Mi código de servicio Web

<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

¿Podría publicar su archivo web.config? Sé dónde está el problema, solo necesito una confirmación antes de publicar la respuesta. –

+0

@DarinDimitrov He agregado el web.config pero he eliminado los detalles confidenciales – skyfoot

Respuesta

10

DOH, que estaba trabajando en el web.config mal.

Como muchas preguntas sobre SO, la solución fue agregar lo siguiente.

<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

Gracias. Resolvió mi problema Pero puedes explicar lo que hace. En mi caso, es específico de una máquina. Alguna idea ¿Cuál podría ser el motivo? Y cuál podría ser la solución si no quiero cambiar mi archivo de configuración, ya que funciona bien en otra máquina. – Akie

+0

Me alegro de que estuvieras trabajando en web.config mal y publicaras preguntas y respuestas. Esto me ahorró mucho tiempo. –

+0

@Akie Tampoco estoy seguro, pero lo que sí puedo decir es que ScriptHandlerFactory agregará sus WebServices a su código JavaScript como referencias en tiempo de compilación. Esto significa que puede llamar directamente a los WebMethods en sus WebServices, a través de la sintaxis 'namespace.class.method' en JavaScript. Sin embargo, aquí es donde estoy confundido, así que no puedo dar ninguna respuesta al respecto. –

9

que tenían el mismo problema y terminar de ejecutar este comando ...

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

Tenga en cuenta que tendrá que tener su símbolo del sistema en modo de administrador para que funcione.

Cuestiones relacionadas