2012-08-16 31 views
7

Tôi có jquery gọi một webservice asp.net với một số nguyên. Trên ứng dụng legaacy của chúng tôi đã được chuyển sang .net 4.0 Tôi không thể thực hiện cuộc gọi này. tôi có thể gọi một phương thức mà không có thông số nhưng gửi dữ liệu đến phương pháp web sẽ trả về lỗi sau:jQuery Ajax tới dịch vụ web asp.net asmx ném Yêu cầu định dạng không hợp lệ: 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() 

Tôi tạo ra chính xác cùng mã trong một dự án trống và nó làm việc tốt. Tôi không thể thấy bất cứ điều gì trong web.config rằng dự án trống được thêm vào sẽ tạo sự khác biệt.

Bộ luật 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 Web Service Mã

<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

Bạn có thể đăng tệp web.config của mình không? Tôi biết vấn đề ở đâu, chỉ cần xác nhận trước khi tôi đăng câu trả lời. –

+0

@DarinDimitrov Tôi đã thêm web.config nhưng đã xóa các chi tiết nhạy cảm – skyfoot

Trả lời

10

DOH, Tôi đã làm việc trong web.config sai.

Giống như rất nhiều câu hỏi về giải pháp SO là thêm phần sau đây.

<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

Cảm ơn. Giải quyết vấn đề của tôi. Nhưng bạn có thể giải thích những gì nó làm. Trong trường hợp của tôi nó là cụ thể cho một máy. Bất kỳ ý tưởng gì có thể là lý do? Và những gì có thể là giải pháp nếu tôi không muốn thay đổi tập tin cấu hình của tôi vì nó hoạt động tốt trên máy khác. – Akie

+0

Rất vui vì bạn đã làm việc trong web.config sai và đăng câu hỏi và câu trả lời. Điều này đã cứu tôi rất nhiều thời gian. –

+0

@Akie Tôi cũng không chắc chắn, nhưng những gì tôi có thể nói với bạn là ScriptHandlerFactory sẽ thêm dịch vụ Web của bạn vào mã JavaScript của bạn làm tài liệu tham khảo tại thời gian biên dịch. Điều này có nghĩa là bạn có thể gọi trực tiếp tới WebMethods trong WebServices của bạn, thông qua cú pháp 'namespace.class.method' trong JavaScript. Tuy nhiên, đây là nơi tôi đang bối rối, vì vậy tôi không thể đưa ra bất kỳ câu trả lời nào về nó. –

9

tôi đã cùng một vấn đề và kết thúc lên chạy lệnh này ...

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

Lưu ý rằng bạn sẽ cần phải nhắc lệnh của bạn trong chế độ quản trị cho nó để làm việc.

Các vấn đề liên quan