试图让 JQuery Post 与 WCF 通信,但 JSON 数据未被接受

Posted

技术标签:

【中文标题】试图让 JQuery Post 与 WCF 通信,但 JSON 数据未被接受【英文标题】:Trying to get a JQuery Post to communicate with WCF, but the JSON data is not being accepted 【发布时间】:2011-09-29 21:21:28 【问题描述】:

我正在使用以下 JQuery\javascript 代码与 WCF 4 REST 服务进行通信。

<script>
var serviceUrl = "http://services.xiine.com/Xiine/Live/AccountService/rest/json/Login";
var userInfo = 
    "IsNotEncrypted":true,
    "Password":null,
    "UserName":null
;

var loginSuccess = function(data, textStatus, jqXHR)
console.log("yay");
;
var loginError = function()
console.log("oh no");
;

$.post(serviceUrl , userInfo, loginSuccess);
$.post(serviceUrl , loginSuccess);

</script>

我正在尝试确定为什么当我不传递用户数据时服务会正确返回错误值:

$.post(serviceUrl , loginSuccess);

与我传递用户数据时相反,此时它会给出 POST 400(错误请求)错误。

$.post(serviceUrl , userInfo, loginSuccess);

我确信这与 JSON 对象 userInfo 的构建或解释方式有关,如果有帮助,我可以发布 Fiddler 2 或 WireShark 转储。让我知道...

我真的无权更改服务的 WCF 端,所以希望我能做些什么来完成这项工作。

谢谢!

编辑

我得到了更多信息...显然,问题在于服务器响应以下错误:

服务器在处理请求时遇到错误。异常消息是“传入消息>具有意外的消息格式“原始”。该操作的预期消息格式为“Xml”、>“Json”。这可能是因为尚未在绑定上配置 WebContentTypeMapper。有关更多详细信息,请参阅 >WebContentTypeMapper 的文档。'。有关更多详细信息,请参阅服务器日志。 >异常堆栈跟踪是:

在 System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.CompositeDispatchFormatter。 DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

所以我想我需要弄清楚如何通过 JQuery.post() 方法让对象作为 JSON 对象通过网络。

更多信息 --- 再次...

好的...没有app.config或web.config,像这样的。

就合同和代码而言,这是我能得到的东西。

[ServiceContract]
public interface IAccount

[OperationContract]
bool Login(UserInformation user);


[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class AccountService : IAccount

public bool Login(UserInformation user)

    //stuff...



[DataContract]
public class UserInformation

[DataMember(IsRequired = true)]
public string UserName;

[DataMember(IsRequired = true)]
public string Password;

[DataMember(IsRequired = true)]
public bool IsNotEncrypted;


public interface IUserInformation

UserInformation UserInformation  get; set; 

【问题讨论】:

请发布您的 WCF 服务配置。 很遗憾,我无法访问它... 【参考方案1】:

所以,我找到了问题的答案。

有人试图通过提到 JSON.stringify() 方法来为我指明正确的方向,但我花了一点力气才让它正确实现。

最后,我使用 WireShark 嗅探出 http 请求,查看实际发送和接收的内容,并观察到我不仅需要对数据进行 sttingify,而且还需要指定内容类型。

这是最终代码。

// This is the URL that is used for the service.
var serviceUrl = "http://services.xiine.com/Xiine/Live/AccountService/rest/json/Login";


// This is the JSON object passed to the service
var userInfo = 
    "UserName": null,
    "Password": null,
    "IsNotEncrypted": true
;

// $.ajax is the longhand ajax call in JQuery
$.ajax(
    type: "POST",
    url: serviceUrl,
    contentType: "application/json; charset=utf-8",

    // Stringify the userInfo to send a string representation of the JSON Object
    data: JSON.stringify(userInfo),
    dataType: "json",
    success: function(msg) 
        console.log(msg);
        );

【讨论】:

【参考方案2】:

在您的服务接口中,您需要具有 OperationalContract 属性,并且在该属性中,您需要设置 RequestFormat。以下是它的外观示例。

[OperationContract, WebInvoke(UriTemplate = "/runGenericMethodJSON", Method = "POST",
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.WrappedRequest)]

【讨论】:

我已尝试实施您的建议,但似乎没有奏效...[OperationContract, WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)] bool Login(XiineUserInformation user);

以上是关于试图让 JQuery Post 与 WCF 通信,但 JSON 数据未被接受的主要内容,如果未能解决你的问题,请参考以下文章

400 Bad Request HTTP Response 使用 WCF POST 通过 JQuery

POST调用WCF方法-项目实践

尝试发布到 wcf rest 4 服务时出现错误请求

我有一个供应商试图与我的 WCF api 通信,他们收到 http:500 错误,但 IIS 日志记录未显示详细信息

启用从 jQuery ajax 到不在 IIS 中托管的 WCF 服务的 CORS POST

使用 POST 方法从 jQuery Ajax 调用 WCF 服务