javascript - 使用WCF Rest进行跨域调用时出错

标签 javascript c# jquery ajax wcf

我正在尝试使用 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 向我展示了这一点,所以我不知道我做错了什么......

request error

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,请检查下一张图片:

error on debug

最佳答案

在您的服务契约(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/

相关文章:

javascript - 如何根据任意对象值对数组进行排序?

javascript - Electron:__ 是针对不同版本的 Node.js 编译的

javascript - 使用 onload javascript 的问题

c# - Xamarin Android ListView - 删除按钮多次触发

javascript - 倒计时器可在同一页面的多个地方使用

javascript - 禁用缓存后,Chrome CORS 请求会更快吗?

C# 通过 Delegate.CreateDelegate 使用具有值类型的属性

c# - 响应式用户界面 6 : How can I achieve same functionality of version 4 in version 6

javascript - 如何保存树的顺序?

javascript - 无法使用 jQuery 和 AJAX 发送 POST 请求