我正在尝试使用 CORS 调用创建 WCF 服务,到目前为止,我的服务器具有此处指示的类:http://enable-cors.org/server_wcf.html
我能够使用不带任何参数的动词 GET 进行 jQuery ajax 调用,当我尝试将参数传递给我的请求时,问题就出现了,这是我的代码:
界面标记:
[OperationContract]
[WebInvoke(Method = "*",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest)]
string GetData(TestClass value);
方法标记:
public string GetData(TestClass value)
{
return value.Id.ToString();
}
js 标记:
var value = {
Id : "2",
Name: "qwe"
};
$.ajax({
url: "http://localhost:38733/Service1.svc/GetData",
type: "POST",
contentType: "application/json",
dataType: "json",
data: JSON.stringify({ value: value }),
success: function(result) {
console.log(result);
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR);
}
});
但是如果我调试,我总是得到 null,这意味着参数没有传递给方法,我还得到 POST http://localhost:38733/Service1.svc/GetData 400(错误请求)
在 Chrome 控制台上。
我做错了什么?
UPDATE
Web.config 标记:
<behavior name="jsonBehavior">
<webHttp />
<crossOriginResourceSharingBehavior />
</behavior>
<extensions>
<behaviorExtensions>
<add name="crossOriginResourceSharingBehavior"
type="WCFSecureService.EnableCrossOriginResourceSharingBehavior, WCFSecureService, Version=1.0.0.0, Culture=neutral" />
</behaviorExtensions>
</extensions>
<services>
<service name="WCFSecureService.Service1">
<endpoint address=""
binding="webHttpBinding"
behaviorConfiguration="jsonBehavior"
contract="WCFSecureService.IService1" />
</service>
</services>
在 Google Chrome 控制台上,我收到以下信息:
选项 http://localhost:38733/Service1.svc/GetData?value=5
UPDATE
如果我向不带任何参数的方法发出请求,它就会起作用
UPDATE
Fiddler 2 向我展示了这一点,所以我不知道我做错了什么......
UPDATE
TestClass 标记:
[DataContract]
public class TestClass
{
private int id;
private string name;
[DataMember]
public string Name
{
get { return name; }
set { name = value; }
}
[DataMember]
public int Id
{
get { return id; }
set { id = value; }
}
}
UPDATE
如果我使用 JSON.stringify({ value: value })
和 BodyStyle = WebMessageBodyStyle.Bare
我到达服务器,但我得到的所有属性均为 0,请检查下一张图片:
最佳答案
在您的服务契约(Contract)中,您可能需要添加一个可选的 WebGet
指令。
[WebGet(UriTemplate = "GetData/{value}")]
string GetData(int value);
要查找的另一件事是您在 web.config 中为您的 enpoint 定义了 json
行为。
<endpointBehaviors>
<behavior name="jsonBehavior">
<webHttp defaultOutgoingResponseFormat="Json"/>
</behavior>
<behavior name="xmlBehavior">
<webHttp defaultOutgoingResponseFormat="Xml"/>
</behavior>
</endpointBehaviors>
注意:如果您使用行为,则需要按以下方式指定格式
http://localhost:38733/Service1.svc/json/GetData/5
或
http://localhost:38733/Service1.svc/xml/GetData/5
另外,你可以试试这个js吗:
var _data= {
value:5
};
$.ajax({
...
data: _data,
success: function(data) {
console.log(data);
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR);
}
});
或者相反:
$.ajax({
url: "http://localhost:38733/Service1.svc/json/GetData/5",
});
关于javascript - 使用WCF Rest进行跨域调用时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30903409/