2011-10-14 39 views
5

Tôi đang tạo một dịch vụ web WCF sẽ trả về một đối tượng json, nhưng tôi vẫn nhận được lỗi yêu cầu 400 lỗi khi thực hiện cuộc gọi AJAX:400 Yêu cầu không hợp lệ khi cố gắng liên lạc với dịch vụ WCF bằng cách sử dụng XHR

OPTIONS http://localhost:55658/WebServiceWrapper.svc/GetData?_=1318567254842&value=97   HTTP/1.1 
Host: localhost:55658 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
DNT: 1 
Connection: keep-alive 
Origin: http://localhost:3000 
Access-Control-Request-Method: GET 
Access-Control-Request-Headers: content-type 

HTTP/1.1 400 Bad Request 
Server: ASP.NET Development Server/10.0.0.0 
Date: Fri, 14 Oct 2011 04:40:55 GMT 
X-AspNet-Version: 4.0.30319 
Cache-Control: private 
Content-Length: 0 
Connection: Close 

đây là lời gọi AJAX của tôi:

$.ajax({ 
    contentType: 'application/json', 
    url: 'http://localhost:55658/WebServiceWrapper.svc/GetData', 
    dataType: 'json', 
    data: { 
    value: 97 
    }, 
    success: function (data) { 
    alert('success' + data); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
    alert('failure' + errorThrown); 
    } 
}); 

Dưới đây là định nghĩa dịch vụ WCF của tôi:

public class WebServiceWrapper : IWebServiceWrapper 
{ 
    public object GetData(int value) 
    { 
     return new 
     { 
      ReturnValue = string.Format("You entered: {0}", value) 
     }; 
    } 
} 

Và nó interface:

[ServiceContract] 
public interface IWebServiceWrapper 
{ 
    [OperationContract] 
    object GetData(int value); 
} 

Tôi biết tôi đã giải quyết vấn đề này trước đây, nhưng tôi không thể nhớ những gì tôi đã làm trước đây. Bất kỳ sự trợ giúp nào cũng sẽ được đánh giá rất cao vì cái lỗ mà tôi đặt vào tường ngày càng to hơn.

+1

Bạn có chắc chắn số cổng bạn sử dụng trong cuộc gọi ajax (55658) không? Nguồn gốc được báo cáo là 3000. –

Trả lời

1

Có một vài điều bạn có thể cần phải làm (hoặc kiểm tra xem bạn đã làm):

GetData OperationContract của bạn cần được trang trí với [WebGet] thuộc tính.


    [WebGet] 
    [OperationContract] 
    object GetData(int value); 

lớp WebServiceWrapper của bạn cần được trang trí với [AspNetCompatibilityRequirements] thuộc tính (Thêm một tham chiếu đến System.ServiceModel.Web cho điều này sẽ có sẵn)


    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class WebServiceWrapper : IWebServiceWrapper 

Giá trị trả về từ hoạt động GetData sẽ cần để được bọc. Một cách dễ dàng là sử dụng một JavaScriptSerializer serialize đối tượng JSON


    var serializer = new JavaScriptSerializer(); 
    return serializer.Serialize(new 
           { 
            ReturnValue = string.Format("You entered: {0}", value) 
           }); 

Bạn cần phải chắc chắn rằng bạn đang sử dụng một [webHttpBinding] ở điểm cuối của bạn (khách hàng và dịch vụ)

<endpoint ... binding="webHttpBinding" ... /> 

Tôi không biết nếu điều tiếp theo này là bắt buộc, nhưng bạn có thể cần một hành vi điểm cuối cho phép tập lệnh web

<endpointBehaviors> 
    <behavior name="[endpointBehaviorName]"> 
     <enableWebScript/> 
    </behavior> 
</endpointBehaviors> 

Bạn rõ ràng sẽ cần tham khảo cấu hình hành vi này tại điểm cuối của bạn

<endpoint ... behaviorConfiguration="[endpointBehaviorName]" ... /> 
0

Nhìn vào yêu cầu của bạn, bạn đang làm cho một yêu cầu OPTIONS chứ không phải là GET, mà tôi nghĩ jQuery không tự động nếu bạn cố gắng làm một yêu cầu XHR cross-site, xem câu hỏi này:

Why am I getting an OPTIONS request instead of a GET request?

Tôi thậm chí không chắc chắn rằng máy chủ của bạn hỗ trợ phương pháp OPTIONS, do đó lỗi 400 của bạn.

Ngay cả số cổng khác nhau được coi là yêu cầu qua nhiều trang, vì vậy bạn nên tạo trang proxy trên trang web thực sự làm cho yêu cầu HTTP đến Dịch vụ WCF của bạn.

0

Có vẻ như bạn đang vi phạm số same origin policy restriction. Bạn không thể gửi yêu cầu AJAX miền chéo. Ứng dụng của bạn được lưu trữ trên http://localhost:3000 và bạn đang cố gửi yêu cầu AJAX đến http://localhost:55658. Không thể nào. Bạn chỉ có thể gửi yêu cầu AJAX đến http://localhost:3000.Bạn có thể sử dụng JSONP để tránh sự hạn chế này. Và đây là another article trên MSDN.

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