【问题标题】:WCF REST Service returns HTTP 400 Bad RequestWCF REST 服务返回 HTTP 400 错误请求
【发布时间】:2012-01-09 11:54:51
【问题描述】:

我一直在尝试创建一个简单的 WCF RESTful Web 服务,但它似乎只能在 SOAP 模式下工作。我正在使用本地 IIS 托管我的服务。

看起来很标准:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    Guid Login(string username, string password);
...

和:

public class MyService : IMyService
{
    [WebGet(UriTemplate = "login?user={user}&password={password}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    public Guid Login(string username, string password)
    {
        return Guid.Empty;
    }

我还在配置文件中包含了该行为并在以下位置使用它:

<endpoint address="" binding="webHttpBinding" contract="MyService" behaviorConfiguration="webHttp"/>

根据我所知道的所有例子......

现在的问题是,当从使用 ServiceReference 的存根客户端调用登录时,它在 Fiddler 中看起来很好,但它是 SOAPy。 由于某种原因,我无法以 RESTy 方式调用我的服务,即使 /help 似乎也返回了 400 Bad Request。 (我正在调用 http://localhost:8080/MyService.svc/help 或 /login 等)

是什么阻止了 REST 采取行动? 在此先感谢:)

编辑:我找到了答案。

事实证明,必须定义路由...

将其添加到 Global.asax 后:

    protected void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.Add(new ServiceRoute("MyService",
           new WebServiceHostFactory(), typeof(MyService)));
    }

一切顺利。

另外,我知道“.svc”现在不是 URL 的一部分。

【问题讨论】:

  • 一般来说,通过 GET 登录被认为是不好的做法,因为它在概念上是一种状态更改。使用 POST(优先使用 HTTPS)。
  • 要调用 REST 服务,您不应在客户端执行添加服务引用。您需要使用 HttpWebRequest 类以 RESTful 方式调用它。

标签: wcf rest bad-request


【解决方案1】:

您的代码对我来说看起来不错。你能尝试几件事吗

[OperationContract]
[WebGet(UriTemplate = "/Login/{username}/{password}", ResponseFormat = WebMessageFormat.Xml)]
Guid Login(string username, string password);

同时请从 MyService.Login 函数中移除 WebGet 属性。

-或-

将此块放入您的 web.config 下的 system.web

<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>

希望这会有所帮助。

【讨论】:

  • 还是什么都没有 :( 我得到的只是:HTTP/1.1 400 Bad Request Server: Microsoft-IIS/7.5 X-Powered-By: ASP.NET Date: Mon, 09 Jan 2012 12:22:22 GMT Content-Length: 0
  • 试试这个 和一个行为
  • 我正在使用这个精确的配置! (只是名称不同,我使用的是“webHttp”而不是“RestFriendly”——但我想这并不重要,就像变量名一样......)
  • 您能否浏览 URL,而不是从服务参考中调用它,因为这个 RESTful,您应该能够看到 GUID 作为响应。在我的项目中,我从 REST 服务返回了 Stream。您也可以查看 IIS 日志。
  • 使用 chrome 浏览 URL 会得到一个空白页面,当使用 Fiddler Compose 时,我可以看到该空白页面实际上是一个没有正文的 HTTP 400 错误请求响应。我现在将检查 IIS 日志,这是个好主意。
【解决方案2】:

我有同样的问题 原因是我发布的 xml 顶部有以下内容

<?xml version="1.0" encoding="utf-16"?>

我删除了它,它只是工作!

【讨论】:

  • HTTP 中的 XML 仅支持 UTF-8。
猜你喜欢
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
相关资源
最近更新 更多