Использование операции void service в службе данных WCF - PullRequest
1 голос
/ 28 июля 2010

от клиента службы данных Wcf (унаследовано от System.Data.Services.Client.DataServiceContext) Я хотел бы вызвать операцию службы, определенную в службе данных Wcf, которая возвращает void

[WebGet]
public void Operation()
{
  // logic
}

Единственный разумный метод, который я нашел, это Execute, но как я могу использовать его с операцией void?

Спасибо

Ответы [ 3 ]

2 голосов
/ 28 июля 2010

Вы можете использовать просто простой HttpWebRequest для этого. Я думаю, что это должна быть операция службы POST (поскольку GET предполагает некоторый ответ, но, поскольку вы объявляете его как void, он не будет иметь никакого ответа). В этом случае Execute не может быть использован в любом случае (так как он всегда выдает запрос GET). Используя обычный HttpWebRequest, просто введите простой POST для URL-адреса операции службы и просто проверьте код состояния ответа (должно быть 204 No Content). В настоящее время службы данных WCF не имеют встроенной клиентской поддержки для операций службы, поэтому вам нужно написать ее для себя.

0 голосов
/ 16 мая 2012

Спасибо, что искал подобное решение.Делал, используя HttpWebRequest первым способом.Но ваши две строки кода помогли мне выполнить ту же задачу.Очень счастлив.Еще раз спасибо .. var query = context.CreateQuery ("Authenticate"). AddQueryOption ("Имя пользователя", "itye" "). AddQueryOption (" Пароль "," 123456 ");

boolauthenticated = context.Execute (новый Uri (query.RequestUri.ToString (). Replace ("Authenticate ()", "Authenticate"))). FirstOrDefault ();

0 голосов
/ 12 апреля 2011

Я нашел решение этой проблемы. Этот сайт решил меня довольно много проблем раньше, поэтому я подумал, что было бы неплохо поделиться с вами.

Быстрый ответ на ваш вопрос:

 string empty = context.Execute<string>(new Uri("Operation", UriKind.Relative)).FirstOrDefault();

«Пустая» строка должна быть нулевой или пустой при ответе. Он работает вокруг метода HttpWebRequest, упомянутого в посте выше.

Более того, можно также получить примитивных типов обратно, используя эту технику. Допустим, у меня есть этот метод:

[WebGet]
public bool Authenticate(string Username, string Password)
{...do stuff here...}

Когда вы пытаетесь выполнить обычное выполнение, оно терпит неудачу (Витек Карас хорошо объясняет это в своем ответе выше):

    var query = context.CreateQuery<bool>("Authenticate").AddQueryOption("Username", "'itye'").AddQueryOption("Password","'123456'");
DataServiceCollection<bool> list = new DataServiceCollection<bool>();
list.Load(query);

Но следующее поможет:

var query = context.CreateQuery<bool>("Authenticate").AddQueryOption("Username", "'itye'").AddQueryOption("Password","'123456'");

bool authenticated = context.Execute<bool>(new Uri(query.RequestUri.ToString().Replace("Authenticate()", "Authenticate"))).FirstOrDefault();

Обратите внимание на функцию Replace ("Authenticate ()", "Authenticate"), которая пропускает () в строке запроса (в противном случае это приведет к ошибке).

Надеюсь, это поможет. - Itye

...