【问题标题】:HTTP 400 Bad Request - CORS enabled WCF ServiceHTTP 400 错误请求 - 启用了 CORS 的 WCF 服务
【发布时间】:2014-03-21 13:48:20
【问题描述】:

我正在尝试在 WCF 上使用 CORS 对服务进行跨域调用。我的大部分东西都在工作,但是当我尝试调用该函数时,它总是给我一个错误 -HTTP 400 Bad Request

我使用 Fiddler 来捕获错误,它说的是这样的

当我试图寻找解决方案时,我看到有人建议使用BodyStyle=WebMessageBodyStyle.Bare。我试过了,但服务出错了,因为我有多个参数。

[OperationContract]
        [WebInvoke(Method = "POST",
                    BodyStyle=WebMessageBodyStyle.Wrapped,
                    RequestFormat=WebMessageFormat.Json,
                    ResponseFormat=WebMessageFormat.Json,
                    UriTemplate = "/GetData")]
        //[WebGet(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "/GetData/{value}/")]
        string GetData(string value, string val2);

我不知道如何解决这个问题。任何帮助将不胜感激。

如果您需要查看更多内容,比如我的配置,请告诉我,我可以分享。

服务电话:

var datav = "{value : 4, val2 : 5}";
            var datasent = JSON.stringify(datav);
    $.ajax({
            type: "POST",
            dataType: 'json',
            contentType: "application/json",
            data: datasent,
            url: pURL,
            success: function (data) {
            alert('success');
            },
            error: function(xhr, status, error) {
              alert(xhr.responseText);
            }
            });

【问题讨论】:

  • 您如何称呼这项服务?
  • 我正在从 HTML 页面进行 ajax 调用
  • 用 WebGet 代替 WebInvoke。
  • 我想做一个“POST”而不是使用“GET”。这就是我使用 CORS 的主要目的
  • 这就是为什么我问你如何调用 Web 服务。粘贴您的 Web 服务调用机制。

标签: c# wcf webinvoke


【解决方案1】:

首先,如果你的服务只是返回数据,不建议使用POST。请改用 GET。但是,如果您要使用 POST,那么这里是在 WCF 中使用它的正确方法。

[OperationContract]
[WebInvoke(Method = "POST",
  BodyStyle=WebMessageBodyStyle.Bare,
  RequestFormat=WebMessageFormat.Json,
  ResponseFormat=WebMessageFormat.Json,
  UriTemplate = "/GetData")]    
string GetData(MyValues values);

这是你的MyValues 课程。

[DataContract]
public class MyValues
{
   [DataMember]
   public string value1{get; set;}

   [DataMember]
   public string value2{get; set;}

   public override string ToString()
   {
      JavaScriptSerializer js = new JavaScriptSerializer(); // Available in   System.Web.Script.Serialization;           
      return js.Serialize(this);
   }
}

请注意,我在MyValues 类中编写了ToString() 方法。这是因为您可以获得从 JSON 调用发送的 JSON 格式。更多详情here.

从 AJAX 调用时,还需要指定 charset

contentType: "application/json; charset=utf-8",

立即检查!确保您在请求中发送正确的 JSON。 ToString() 方法将返回您的服务将接受的所需 JSON 格式。

【讨论】:

  • 谢谢你的回答,我试过了,但它仍然给我同样的错误。我在服务上的方法有两个参数,这迫使我使用“包装”请求。我应该把他们搬到一个班级吗?
  • 创建一个 MyValues 类的对象并调用 ToString() 方法。它将返回 JSON 格式。保持 JSON 格式保存并以 ToString() 方法从 AJAX 调用返回的特定格式发送 JSON。
  • 我不确定我这样做是否正确。但我仍然得到错误。
  • OperationFormatter 遇到无效的消息正文。预计会找到名称为“类型”且值为“对象”的属性。找到值“数组”。是新的错误
  • 谢谢。我想通了,但现在我得到了一个 NULL 引用异常。正在努力解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2011-09-29
  • 2014-01-11
相关资源
最近更新 更多