I have tried every combination to send a request to send a POST request to RESTful WCF from jQuery.
我已经尝试了每个组合来发送请求从jQuery向RESTful WCF发送POST请求。
Can someone imitate and make it working. Code is here : http://pastebin.com/Ua97919C
有人可以模仿并使其发挥作用。代码在这里:http://pastebin.com/Ua97919C
I am working with WCF from past 2 years, but every time i send a POST request it makes me struggle a lot.
我在过去2年与WCF合作,但每次发送POST请求都会让我很烦恼。
I am struggling to make it work from past 4 days and gone through atleast 35-40 posts.
我努力让它在过去的4天里工作,并且经历了至少35-40个帖子。
Eventually, this request would be sent from iPhone to WCF.
最终,此请求将从iPhone发送到WCF。
When i check it with Fiddler the error mostly is: *The server encountered an error processing the request. The exception message is 'The incoming message has an unexpected message format 'Raw'. The expected message formats for the operation are 'Xml', 'Json'. This can be because a WebContentTypeMapper has not been configured on the binding. See the documentation of WebContentTypeMapper for more details.'. See server logs for more details. The exception stack trace is: at
当我用Fiddler检查时,错误主要是:*服务器遇到处理请求的错误。异常消息是'传入消息具有意外的消息格式'Raw'。该操作的预期消息格式是'Xml','Json'。这可能是因为尚未在绑定上配置WebContentTypeMapper。有关更多详细信息,请参阅WebContentTypeMapper的文档。请参阅服务器日志以获取更多详异常堆栈跟踪是:at
System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Message message, Object[] parameters)
at System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.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)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
2 个解决方案
#1
4
Add a Global.ascx
file in youe solution and replace the code with following
在您的解决方案中添加Global.ascx文件,并使用以下代码替换代码
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
HttpContext.Current.Response.End();
}
}
one more thing chnage dataType:'text'
还有一件事chnage dataType:'text'
$.ajax({
type: "POST",
url: "http://localhost:4638/Edulink.svc/SaveUserData",
dataType: "text",
contentType: "application/json",
data:'{"EmailID":"praveen", "LevelID": 1}',
success:function(data, status) {
console.log(data); //gives 1
},
error:function(request, status, error) {
alert("o0ops");
}
});
#2
2
The problem is the body style of the operation. You declared it as
问题是操作的体型。你声明它
[WebInvoke(
Method = "POST",
ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest,
UriTemplate = "/SaveUserData")]
string SaveUserData(UserInfo userInfo);
meaning that the request must be wrapped in an object, with a member for the object name. If you send this request below, it should work.
意味着请求必须包含在一个对象中,并带有对象名称的成员。如果您在下面发送此请求,它应该工作。
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: url,
data: '{"userInfo":{"EmailID":"praveen", "LevelID": 1}}',
dataType: "json",
processData: false,
success: function (data, textStatus, jqXHR) {
debugger;
},
error: function (jqXHR, textStatus, errorThrown) {
debugger;
}
});
Another alternative is to change the BodyStyle
property of the operation to Bare
, in which case your original request was correct.
另一种方法是将操作的BodyStyle属性更改为Bare,在这种情况下,您的原始请求是正确的。
#1
4
Add a Global.ascx
file in youe solution and replace the code with following
在您的解决方案中添加Global.ascx文件,并使用以下代码替换代码
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
HttpContext.Current.Response.End();
}
}
one more thing chnage dataType:'text'
还有一件事chnage dataType:'text'
$.ajax({
type: "POST",
url: "http://localhost:4638/Edulink.svc/SaveUserData",
dataType: "text",
contentType: "application/json",
data:'{"EmailID":"praveen", "LevelID": 1}',
success:function(data, status) {
console.log(data); //gives 1
},
error:function(request, status, error) {
alert("o0ops");
}
});
#2
2
The problem is the body style of the operation. You declared it as
问题是操作的体型。你声明它
[WebInvoke(
Method = "POST",
ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest,
UriTemplate = "/SaveUserData")]
string SaveUserData(UserInfo userInfo);
meaning that the request must be wrapped in an object, with a member for the object name. If you send this request below, it should work.
意味着请求必须包含在一个对象中,并带有对象名称的成员。如果您在下面发送此请求,它应该工作。
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: url,
data: '{"userInfo":{"EmailID":"praveen", "LevelID": 1}}',
dataType: "json",
processData: false,
success: function (data, textStatus, jqXHR) {
debugger;
},
error: function (jqXHR, textStatus, errorThrown) {
debugger;
}
});
Another alternative is to change the BodyStyle
property of the operation to Bare
, in which case your original request was correct.
另一种方法是将操作的BodyStyle属性更改为Bare,在这种情况下,您的原始请求是正确的。