2

我一直在尝试创建一个简单的 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 的一部分。

4

2 回答 2

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>

希望这可以帮助。

于 2012-01-09T12:14:21.493 回答
1

我遇到了同样的问题,原因是我发布的 xml 在顶部有以下内容

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

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

于 2012-12-12T20:11:14.843 回答