ADO.NET DataService: передача параметра в метод [WebInvoke]

Рассмотрим следующий пример:

public class SomeBusinessLayerService : DataService<myentitycontainer>
{
 [WebInvoke]
 void DoSomething(string someParam)
 {
 }
}
</myentitycontainer>

Я не могу найти пример или какую-либо помощь о том, как передать параметр функции! Используя WebClient (или goofinfg вокруг с fiddler), я могу вызвать вызов функции, но независимо от того, что я пытаюсь использовать параметр someParam, всегда имеет значение null Что еще хуже - если я изменил тип на int - все мои попытки заканчиваются следующей ошибкой:

<!--?xml version="1.0" encoding="utf-8" standalone="yes"?-->
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
 
 <message xml:lang="en-US">Bad Request - Error in query syntax.</message>
</error>

Может ли кто-нибудь помочь с рабочим примером контента POST о том, как я могу его назвать?

ПРИМЕЧАНИЕ. Это DataService, а не служба WCF. Я могу заставить его работать с сервисом WCF таким же способом без каких-либо проблем.

EDIT: Также мне нужен пример POST и не встраивание параметра в URI, поскольку URI имеет ограничение по размеру и требование для дезинфекции строки.

5 ответов

Я никогда не получал ответа от команды Microsoft на этот вопрос, поэтому я нашел следующее обходное решение:

Создайте таблицу под названием FunctionRequest с помощью строки RequestID, Result и Paramerter Для выполнения запроса я просто создаю объект. Если мне нужно отправить сложный объект - я использую сериализацию DataContext, чтобы отправить его на сервер. Все вызовы теперь также записываются в базу данных, что отлично подходит для ведения журнала.


После нескольких часов вытягивания моих волос с ответами "Плохой запрос - ошибка в синтаксисе запроса" я, наконец, получил его работу, передав параметры в URI.

Обратите особое внимание на цитаты вокруг строковых параметров:

WRONG: DoSomething? someParam = param CORRECT: DoSomething? someParam = 'param'


Возможно, вам стоит попытаться включить параметр в URI с кавычками (DoSomething? someParam = 'param'). Я пробовал это, и он отлично работает, в другом случае я получал ту же ошибку, что и вы.


Чтобы завершить небольшой ответ antscode, вы не только должны обратить пристальное внимание на окружающие значения параметров кавычками...

НО! Вы также должны префиксные значения Guid с помощью "guid". Например:

var y = ctx.Execute<bool>(new Uri("ReportExists?id=guid'" + Guid.NewGuid() + "'", UriKind.Relative));
</bool>


У меня была аналогичная проблема, я отправлял параметры формы в формате x-www-form-urlencoded (param1=value1¶m2=value2...), используя POST для отмеченного метода [WebInvoke], и мне было трудно узнать, как получить параметры. Я, наконец, добился этого следующим образом:

[WebInvoke]
void DoSomething(Stream requestStream)
{
 StreamReader reader = new StreamReader(stream);
 var requestContent = reader.*********();
 var parameters = HttpUtility.ParseQueryString(requestContent);
 var param1 = parameters["param1"];
 var param2 = parameters["param2"]; //and so on...
}

licensed under cc by-sa 3.0 with attribution.