400 Bad Request HTTP Response 使用 WCF POST 通过 JQuery
Posted
技术标签:
【中文标题】400 Bad Request HTTP Response 使用 WCF POST 通过 JQuery【英文标题】:400 Bad Request HTTP Response using a WCF POST via JQuery 【发布时间】:2010-06-30 03:44:57 【问题描述】:无法让 WCF 服务接受我的 JQuery POST。这是来自 javascript 的 POST:
function jqueryPost()
var url = "/LoggingTest";
$.post(url, message: "test message" );
这就是我通过接口接受 POST 的方式:
[OperationContract]
[WebInvoke(Method = "POST",
UriTemplate = "/LoggingTest",
BodyStyle = WebMessageBodyStyle.Bare)]
void LoggingTest(string message);
以及实现:
public void LoggingTest(string message)
log.Debug(message, null);
当我调用函数 jqueryPost 时,我在 Web 检查器中看到 400 Bad Request 的 HTTP 响应。不确定如何使 POST 请求正常工作。
(于 7 月 1 日添加) @James,这是网络检查器的输出:
http://localhost:4252/LoggingTest HTTP 信息 请求方法:POST 状态码:400 错误请求 请求标头 接受:/ 缓存控制:max-age=0 内容类型:application/x-www-form-urlencoded 来源:http://localhost:4252 推荐人:http://localhost:4252/ 用户代理:Mozilla/5.0 (Windows; U; Windows NT 5.1; C -) AppleWebKit/532.4 (Khtml, like Gecko) Qt/4.6.2 Safari/532.4 X-Requested-With:XMLHttpRequest 表单数据 消息:测试消息 响应标头 内容长度:1165 内容类型:文本/html 日期:格林威治标准时间 2010 年 7 月 1 日星期四 18:56:15 服务器:Microsoft-HTTPAPI/1.0
【问题讨论】:
您可以使用 Fiddler(或类似的东西)并发布完整的请求/响应吗?我想知道它是否发布到了不正确的 url(例如,取决于您是否部署到根目录) James,我已经在上面发布了网络检查器的输出。 【参考方案1】:所以,我刚刚结束了,界面:
[OperationContract]
[WebInvoke(Method = "POST",
UriTemplate = "LoggingTest/logID/logLevel?errorCode=errorCodeInt",
BodyStyle = WebMessageBodyStyle.Bare)]
void LoggingTest(string logID, string logLevel, int errorCodeInt, Stream message);
实施:
public void LoggingTest(string logID, string logLevel, int errorCodeInt, Stream message)
switch (logLevel)
case "error":
log.Error(errorCodeInt, message, null);
break;
case "warn":
log.Warn(errorCodeInt, message, null);
break;
case "info":
log.Info(errorCodeInt, message, null);
break;
case "debug":
log.Debug(errorCodeInt, message, null);
break;
现在它可以工作了。必须与在 UriTemplate 中传递的参数有关,因为当我将其更改为像这样传递参数时:
UriTemplate = "LoggingTest/logID/logLevel?errorCode=errorCodeInt",
它开始接受 POST。
编辑 7/7:这也是最终的 JavaScript:
jqueryPost('LoggingTest/LogID/debug?errorCode=0', message: 'this is a test message' ;
function jqueryPost(url, message)
$.post(url, message);
【讨论】:
我想知道,您能否发布您的最终 Javascript,以便我们查看您的解决方案的端到端。 我会在星期二回到办公室后发布,感谢 Mark 的关注。 这是在帖子正文中传递没有 uritemplate 的字符串值的方法吗? 这不是一个好的解决方案。这违背了 POST 的目的。还不如使用GET。有人知道更好的解决方案吗?我不想要查询参数【参考方案2】:尝试在服务合同上添加以下行,我认为你应该使用 WrappedRequest insted of Bare
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
查看post 以获得更多装饰
【讨论】:
我已经尝试在实现中允许 AspNetCompatibilityRequirementsMode(你不能将它添加到接口中)。我已经在 Bare 和 Wrapped 请求之间切换了。虽然我在网上看到这对很多其他人有帮助......但遗憾的是没有运气。 你用的是什么配置,能把配置贴在这里吗?你检查过我给参考的帖子吗? 我没有使用 IIS,所以没有 .config【参考方案3】:让它为你工作可能只是难题的一部分,但这让我有一段时间感到困惑:
您可能需要仔细检查您的 JSON 语法,我认为它需要在变量和变量名周围使用双引号字符串。
例如
function jqueryPost()
var url = "/LoggingTest";
$.post(url, message: "test message" );
需要:
function jqueryPost()
var url = "/LoggingTest";
$.post(url, "message": "test message" );
n.b.双引号“消息”
编辑:感谢下面的反馈,这里有一些链接可能对格式化 JSON 有用:
Yahoo Developer Network - About the JSON Format json.org Can WCF accept JSON encoded using single quotes and non-quoted identifiers?【讨论】:
-1:该对象不是“JSON”,它只是另一个 JavaScript 对象。 JS 对解析比较宽松,不需要双引号。 嗨@Matti Virkkunen,我知道你来自哪里......我同意JavaScript本身更“宽松”,但是JSON,数据交换格式(即不需要JavaScript)是更严格。 www.JSON.org 建议使用双引号。但老实说,我找不到指向 ECMAScript 5 工作草案的权威信息的良好链接,但 developer.yahoo.com/yui/json(关于 JSON 格式)非常权威。请记住,JSON 语法并不是 JavaScript 本身(请记住 JSON 可以与 javascript 一起使用),它只是一种基于 javacript 子集/启发的格式。 @Matti Virkkunen 上面说了这么多,确实你可以不用双引号来表示值/字符串对。 jquery.post 文档上的示例没有它们。事实上 jquery.post 文档甚至没有说明您需要使用 JSON。但无论哪种方式,我认为它不值得 -1,尤其是服务器端的 c# 需要双引号。 ***.com/questions/4939620/…如果我帮助澄清了事情,请随时修改你的 -1,如果不担心的话。 遇到了这个,developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…,让我记住了这篇文章,这是我遇到的最好的 JSON 描述之一。 我评论的重点是您的代码 sn-p 与 JSON 无关。那里的对象只是将字符串键/值对作为纯 JavaScript 对象传递给 jQuery,它将作为单独的 POST 字段而不是 JSON 发送。在这里声称更严格的 JSON 解析规则有任何相关性是错误的。更清楚地说:这不会向服务器发送“\”message\": \"test message\"”,而是发送“message=test%20message”。以上是关于400 Bad Request HTTP Response 使用 WCF POST 通过 JQuery的主要内容,如果未能解决你的问题,请参考以下文章
HTTP 400 错误 - 请求无效 (Bad request)
HTTP 400 错误 - 请求无效 (Bad request)