Параметры отдыха WCF, включающие сложные типы - PullRequest
7 голосов
/ 10 ноября 2009

Настройка службы WCF, которая использует webHttpBinding ... Я могу вернуть сложные типы из метода в виде XML, хорошо. Как взять в качестве комплексного типа в качестве параметра?

[ServiceContract(Name = "TestService", Namespace = "http://www.test.com/2009/11")]
public interface ITestService
{
    [OperationContract]
    [WebInvoke(Method = "POST", 
               BodyStyle = WebMessageBodyStyle.Bare, 
               UriTemplate = "/Person/{customerAccountNumber}, {userName}, {password}, {PersonCriteria}")]
    Person SubmitPersonCriteria(string customerAccountNumber, 
                                string userName, 
                                string password, 
                                PersonCriteria details);
}

Поскольку UriTemplate допускает только строки, что является лучшим методом? Идея заключается в том, что клиентское приложение отправит запрос в службу, как критерии поиска человека. Служба ответит соответствующим объектом, содержащим данные в виде XML.

Ответы [ 3 ]

8 голосов
/ 10 ноября 2009

Вы можете публиковать сложные типы, используя rest.

[ServiceContract]
public interface ICustomerSpecialOrderService
{    
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "deletecso/")]
    bool DeleteCustomerOrder(CustomerSpecialOrder orderToDelete);
}

Реализация выглядит так:

public bool DeleteCustomerOrder(CustomerSpecialOrder orderToDelete)
{
    // Do something to delete the order here.
}

Вы можете вызвать метод из клиента WPF:

public void DeleteMyOrder(CustomerSpecialOrder toDelete)
{
    Uri address = new Uri(your_uri_here);
    var factory = new WebChannelFactory<ICustomerSpecialOrderService>(address);
    var webHttpBinding = factory.Endpoint.Binding as WebHttpBinding;
    ICustomerSpecialOrderService service = factory.CreateChannel();
    service.DeleteCustomerOrder(toDelete);
}

Или вы также можете вызвать его с помощью HttpWebRequest, записав сложный тип в байтовый массив, который мы делаем из мобильного клиента.

private HttpWebRequest DoInvokeRequest<T>(string uri, string method, T requestBody)
{
    string destinationUrl = _baseUrl + uri;
    var invokeRequest = WebRequest.Create(destinationUrl) as HttpWebRequest;
    if (invokeRequest == null)
        return null;

    // method = "POST" for complex types
    invokeRequest.Method = method;
    invokeRequest.ContentType = "text/xml";

    byte[] requestBodyBytes = ToByteArray(requestBody);
    invokeRequest.ContentLength = requestBodyBytes.Length;


    using (Stream postStream = invokeRequest.GetRequestStream())
        postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);

    invokeRequest.Timeout = 60000;

    return invokeRequest;
}
0 голосов
/ 14 июня 2015

Вы можете передать строку в формате JSON или данные в формате XML в качестве тела ввода в вызове службы REST и указать это в определении контракта на обслуживание.Затем это позволит вам передать объект в качестве входных данных при вызове службы REST.

0 голосов
/ 19 января 2010

Ваши варианты:

  1. используйте POST и примите документ XML произвольной сложности, или
  2. используйте GET и найдите способ сопоставить путь URL с критерием запроса.

Я бы порекомендовал первый, он более приятный и менее хакерский. POST будет представлять запрос, и в ответ вы получите queryId, что-то, относящееся к тому, что вы отправили.

В соответствии с идеями REST, вы можете получить этот идентификатор, чтобы получить результаты запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...