Создание клиента WCF Web Api - PullRequest
0 голосов
/ 13 марта 2012

Я недавно использовал WCF Web Api и использую встроенный в него тестовый клиент WCF Web API для тестирования созданных мной веб-сервисов.

Я хочу создать прокси в коде, построенном из интерфейса, а не запускать svcutil.exe для создания прокси.

Мой веб-сервис работает нормально, однако, когда я использую 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 гласит: «[ServiceContract] больше не требуется для определения класса Web API», однако Channel Factory требует его.

3) Все примеры, которые пока не относятся к веб-API WCF, выглядят следующим образом

HttpClient client = new HttpClient ();

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

Должен ли я использовать HttpClient для своих запросов вместо фабрики каналов?

С уважением, Andrew

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Похоже, что IAccountApi, который вы не показываете, определяет пространство имен для контракта на обслуживание.Если вы действительно хотите пустое пространство имен (не рекомендуется), попробуйте что-то вроде этого:

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

Если пространство имен не определено для IAccountApi, проверьте [DataContract] в RegisterRequest.

0 голосов
/ 31 декабря 2012

Я закончил с использованием класса HttpClient, он позволяет GET, POST, PUT и DELETE, что было хорошо для веб-API WCF (теперь называется http://www.asp.net/web-api)

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

Что касается создания остальных прокси-серверов с использованием codegen или динамического поведения, см. Эту статью Генератор прокси-объектов ReST

...