2012-09-28 28 views
6

Chủ đề này có vẻ là một trong số hàng triệu giải pháp có kết quả hỗn hợp hơn. Vì vậy, xin vui lòng cắt cho tôi một chút slack như tôi sẽ cố gắng để chứng minh những gì đang xảy ra, những gì tôi đang sử dụng và làm thế nào tôi đã cố gắng để giải quyết vấn đề.dịch vụ web asmx - jQuery ajax post json (lỗi 500) - CORS (Access-Control-Allow-Origin được đặt thành *)

môi trường thử nghiệm của tôi đang chạy IIS6 asp.net 2.0, tôi đã thiết lập nó với

'Access-Control-Allow-Origin' * 

Tôi cũng đã thiết lập các động từ cho .asmx phần mở rộng để

"GET,HEAD,POST,DEBUG,OPTIONS" 

qua jQuery v1. 7.2 ajax() gọi tôi có thể GET xml tập tin từ sever, và POST đến một dịch vụ cơ bản trả về một chuỗi với kết quả dự kiến ​​chéo tên miền. Vì vậy, tôi BIẾT ít nhất một phần yêu cầu miền chéo của tôi đang hoạt động.

Vấn đề của tôi nảy sinh khi tôi bắt đầu mở rộng trên đó, và sử dụng json để gửi dữ liệu đến các dịch vụ

Tôi có một phương pháp asmx webservice đơn giản:

 [WebMethod] 
     [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
     public SubResponse HelloWorldX(SubRequestXX SubReq) 
     { 
      SubResponse sr = new SubResponse(); 

      sr.resultCode = "777"; 
      sr.resultMsg = "hello - " + SubReq.EmailAddress; 

      return sr; 
     } 

Rất đơn giản, và không có nhiều ma thuật xảy ra ở đó, tất cả những gì tôi muốn làm là chuyển đối tượng 'SubRequestXX' vào, và bây giờ chỉ cần xác thực nó đã đến đó và trả lời.

Using jQuery: 

    $.ajax({ 
     type: "POST", 
     url: "http://somedomain/subscription/MyService.asmx/HelloWorldX", 
     processData: false, 
     data: '{ "SubReq" : {"EmailAddress":"[email protected]"} }', 
     dataType: "json", 
     contentType: "application/json; charset=utf-8", 
     cache: false, 
     success: function(data, textStatus, jqXHR) { 
      ajaxSucccess3(data, textStatus, jqXHR); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      console.log("Retrieve Hello Failed (AJAX Error): " + jqXHR.statusText + " | " + textStatus + " | " + errorThrown); 
     } 
    }); 
} 

Có lẽ câu trả lời nằm ở đó? nhưng đây là những gì dữ liệu RAW cáy cho thấy tôi sử dụng mã JS cùng chính xác từ một trang trên cùng một tên miền (thành công - Kết quả mã 200):

REQUEST: 
    POST http://somedomain/subscription/Service.asmx/HelloWorldX HTTP/1.1 
    Accept: application/json, text/javascript, */*; q=0.01 
    Content-Type: application/json; charset=utf-8 
    X-Requested-With: XMLHttpRequest 
    Referer: http://somedomain/subscription/subscription_-cors.html 
    Accept-Language: en-us 
    Accept-Encoding: gzip, deflate 
    User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; 9LA) 
    Host: somedomain 
    Content-Length: 45 
    Connection: Keep-Alive 
    Pragma: no-cache 

    { "SubReq" : {"EmailAddress":"[email protected]"} } 

RESPONSE: 

    HTTP/1.1 200 OK 
    Date: Fri, 28 Sep 2012 16:59:15 GMT 
    Server: Microsoft-IIS/6.0 
    X-Powered-By: ASP.NET 
    Access-Control-Allow-Origin: * 
    X-AspNet-Version: 2.0.50727 
    Cache-Control: private, max-age=0 
    Content-Type: application/json; charset=utf-8 
    Content-Length: 147 

    {"d":{"__type":"SubService.DataObj.SubResponse","resultCode":"777","resultMsg":"hello - [email protected]"}} 

Vì vậy, Tất cả mọi thứ sẽ rất tốt và hoạt động như mong đợi. Bây giờ nếu tôi đi cùng html/code js, triển khai trên máy chủ khác và thực hiện yêu cầu tương tự (cross-site) cho thấy cáy (không kết quả đang 500):

REQUEST: 
    POST http://somedomain/subscription/Service.asmx/HelloWorldX HTTP/1.1 
    Accept: */* 
    Origin: http://www.crossdomainsite.com 
    Accept-Language: en-US 
    Accept-Encoding: gzip, deflate 
    User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; 9LA) 
    Host: somedomain 
    Content-Length: 0 
    Connection: Keep-Alive 
    Pragma: no-cache 


RESPONSE: 
HTTP/1.1 500 Internal Server Error 
Date: Fri, 28 Sep 2012 16:58:56 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Access-Control-Allow-Origin: * 
X-AspNet-Version: 2.0.50727 
Cache-Control: private 
Content-Type: text/html; charset=utf-8 
Content-Length: 4732 

..... 

Request format is unrecognized for URL unexpectedly ending in '/HelloWorldX' 

..... 

[InvalidOperationException: Request format is unrecognized for URL unexpectedly ending in '/HelloWorldX'.] 
    System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response) +405961 
    System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath) +212 
    System.Web.Script.Services.ScriptHandlerFactory.GetHandler(HttpContext context, String requestType, String url, String pathTranslated) +47 
    System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, VirtualPath path, String pathTranslated, Boolean useAppConfig) +193 
    System.Web.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +93 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 

Nhiều kết quả tìm kiếm gợi ý một vài web. thay đổi cấu hình. nếu tôi thêm dòng sau vào phần system.web tôi:

<webServices> 
     <protocols> 
      <add name="HttpGet"/> 
      <add name="HttpPost"/> 
     </protocols> 
    </webServices> 

sau đó yêu cầu của tôi trông giống như

POST http://somedomain/subscription/Service.asmx/HelloWorldX HTTP/1.1 
Accept: */* 
Origin: http://www.crossdomainsite.ca 
Accept-Language: en-US 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; 9LA) 
Host: somedomain 
Content-Length: 0 
Connection: Keep-Alive 
Pragma: no-cache 

và phản ứng của tôi:

HTTP/1.1 500 Internal Server Error 
Date: Fri, 28 Sep 2012 17:37:00 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Access-Control-Allow-Origin: * 
X-AspNet-Version: 2.0.50727 
Cache-Control: private 
Content-Type: text/plain; charset=utf-8 
Content-Length: 461 

System.InvalidOperationException: HelloWorldX Web Service method name is not valid. 
    at System.Web.Services.Protocols.HttpServerProtocol.Initialize() 
    at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response) 
    at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing) 

Vì vậy, nói thêm rằng phần để web của tôi. config đã làm điều gì đó vì kết quả của tôi hơi khác một chút. Nhưng tôi không thể phân biệt được cái gì.

giải pháp khác cho thấy các thiết lập cấu hình web kể từ khi tôi đang sử dụng asp.net 2.0, lưu ý tôi đã để lại những như trong tất cả các kết quả trên, nhận xét ra cái là gốc từ dự án sáng tạo:

 <httpHandlers> 
      <remove verb="*" path="*.asmx"/> 
      <!--<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>--> 
      <add path="*.asmx" verb="*" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 

      <!--<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>--> 
      <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 

      <!--<add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>--> 
      <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/> 
     </httpHandlers> 

Vì vậy, ... Câu hỏi lớn ... Tại sao các yêu cầu cross-site của tôi lại không có cùng mã, mặc dù tất cả những điều trên? Có vẻ như ngay sau khi yêu cầu đến từ một miền khác, nó sẽ kích hoạt trên JSON.

Bất kỳ trợ giúp nào sẽ được đánh giá rất cao khi giải quyết bí ẩn này. Tôi giả định của nó hoặc là một IIS6 (máy chủ) thiết lập hoặc $ của tôi.ajax() gọi và tôi cảm thấy như nó có thể là một cái gì đó đơn giản hoặc nhỏ, nhưng tôi dường như không thể đặt ngón tay của tôi trên đó.

Trả lời

0

Tôi đã thử một cái gì đó bằng simillar qua JSONP. Tôi nghĩ rằng tôi dựa trên giải pháp ra khỏi bài viết này.

JSONP + CORS

Một điều tiềm năng là đưa vào JSON của bạn như là một chuỗi đến một dịch vụ WCF thường không kết thúc tốt đẹp (Tôi biết đây không phải là WCF, chỉ nói rằng nó có thể là cùng một vấn đề). Tôi thường làm điều này:

Using jQuery: 

$.ajax({ 
    type: "POST", 
    url: "http://somedomain/subscription/MyService.asmx/HelloWorldX", 
    processData: false, 
    data: JSON.parse('{ "SubReq" : {"EmailAddress":"[email protected]"} }'), 
    dataType: "json", 
    contentType: "application/json; charset=utf-8", 
    cache: false, 
    success: function(data, textStatus, jqXHR) { 
     ajaxSucccess3(data, textStatus, jqXHR); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     console.log("Retrieve Hello Failed (AJAX Error): " + jqXHR.statusText + " | " + textStatus + " | " + errorThrown); 
    } 
}); 
} 

Việc sử dụng JSON.parse cũng sẽ bắt được bất kỳ JSON sai nào đi qua.

Hy vọng điều này sẽ khắc phục được sự cố của bạn.

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