【问题标题】:Creating a WCF Web Api Client创建 WCF Web Api 客户端
【发布时间】:2012-03-13 09:32:06
【问题描述】:

我最近一直在使用 WCF Web Api,并且一直在使用内置的 WCF Web API 测试客户端来测试我创建的 Web 服务。

我想在基于接口构建的代码中创建代理,而不是运行 svcutil.exe 来创建代理。

我的 web 服务工作正常,但是当我使用 fiddler 检查发送的消息时,它会将命名空间放入 xml 消息中。

下面是我用来发送请求的代码。

        RegisterRequest registerRequest = new RegisterRequest
                                              {
                                                  Email = "test@test.com",
                                                  Firstname = "firstname",
                                                  Lastname = "lastname",
                                                  Password = "password"
                                              };


        var factory = new ChannelFactory<IAccountApi>(new WebHttpBinding(), "http://localhost/WebServices/api/account");
        factory.Endpoint.Behaviors.Add(new WebHttpBehavior());
        var proxy = factory.CreateChannel();
        proxy.Register(registerRequest); 

下面这个请求是通过客户端生成的,失败了,返回500内部服务器错误

<RegisterRequest xmlns="http://schemas.datacontract.org/2004/07/ServiceModel.Accounts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Email>test@test.com</Email><Firstname>firstname</Firstname><Lastname>lastname</Lastname><Password>password</Password></RegisterRequest>

当我使用 api 测试客户端发送以下消息时使用相同的标头

<RegisterRequest><Email>test@test.com</Email><Firstname>firstname</Firstname><Lastname>lastname</Lastname><Password>password</Password></RegisterRequest>

唯一的区别是命名空间已被删除。

最后几点,

1) 如果我能够删除此命名空间,请求将起作用

2) 我不确定 ChannelFactory 是否可以与 WCF Web Api 结合使用。原因是 http://wcf.codeplex.com/releases/view/73423 声明“Web API 类定义不再需要 [ServiceContract]”,但 Channel Factory 需要它。

3) 到目前为止 WCF Web API 的所有示例如下所示

HttpClient 客户端 = 新的 HttpClient();

Contact contact = new Contact() { Name = name };
var response = client.Post("http://localhost:9000/api/contacts/",
    new ObjectContent<Contact>(
        contact, JsonMediaTypeFormatter.DefaultMediaType));

我应该使用 HttpClient 而不是通道工厂来处理我的请求吗?

问候, 安德鲁

【问题讨论】:

    标签: wcf dynamic proxy


    【解决方案1】:

    您未显示的 IAccountApi 似乎正在为服务合同定义命名空间。如果您真的想要一个空的命名空间(不是最佳实践),请尝试以下操作:

     [ServiceContract(Namespace="")]
     public interface IAccountApi
     { ... }
    

    如果没有为 IAccountApi 定义命名空间,请检查 RegisterRequest 的 [DataContract]。

    【讨论】:

    【解决方案2】:

    我最终使用了 HttpClient 类,它允许 GET、POST、PUT 和 DELETE,这对于 WCF Web API(现在称为 http://www.asp.net/web-api)来说很好。

    http://msdn.microsoft.com/en-us/library/system.net.http.httpclient.aspx

    至于使用 codegen 或动态构建 rest 代理,请参阅这篇文章 ReST Proxy Object Generator

    【讨论】: