【发布时间】: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 而不是通道工厂来处理我的请求吗?
问候, 安德鲁
【问题讨论】: