Службы данных WCF: как вызывать POST-операции с большим телом - PullRequest
2 голосов
/ 21 ноября 2011

Как вызвать операции служб данных WCF из клиента служб WCF?

У меня есть эта операция в моей службе:

[WebInvoke(Method="POST")]
public void Add(int ContractId, string Partners)
{
    ...
}

Как мне вызвать эту операцию из моего клиента?Мой клиент - приложение на C #.учитывая, что строка «Партнеры» очень длинная.это объединение идентификаторов партнеров, таких как: «1,2,3,4, ... 990».

Я пытался сделать следующее:

        string requestString = string.Format("Add?contractId={0}&Partners={1}",  ContractId, groupIdParam);

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceUrl +
            requestString);

        request.Method = "POST";

        var response = request.GetResponse();

, но я получаюошибка: «HTTP 414: запрос Uri слишком длинный»

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

В настоящее время OData не поддерживает передачу параметров для сервисных операций (именно таков метод WebInvoke) в теле запроса POST. Все параметры передаются в URL, и поэтому они должны быть довольно маленькими (обычно что-то менее 2048 символов, зависит от вашего веб-сервера, прокси и т. Д.).

1 голос
/ 21 ноября 2011

На самом деле, вы не выполняете POST-запрос.Запрос POST предоставляет информацию в теле запроса, поэтому он используется специально для больших наборов данных.Вы должны указать как contractId, так и partners в теле запроса.Вы можете использовать метод HttpWebRequest.GetRequestStream() для получения потока, в который затем записываются параметры.

Эта ссылка http://en.wikipedia.org/wiki/POST_(HTTP) описывает структуру, используемую для указания пар имя-значение в запросе.body.

Таким образом, вы можете написать что-то вроде этого (не проверено):

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceUrl + "Add");
using (Stream bodyStream = request.GetRequestStream())
using (StreamWriter writer = new StreamWriter(bodyStream))
{
    writer.Write("contractId: {0}", contractId);
    writer.Write("partners: {0}", String.Join(",", partners);
}

request.GetResponse();

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

...