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 ERROR 400 Bad Request

400 BAD request HTTP错误码是啥意思?

HTTP 400 错误 - 请求无效 (Bad request)

HTTP 400 错误 - 请求无效 (Bad request)

微博中出现http/1.1 400 Bad Request怎么解决。

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