【发布时间】: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