WCF WebInvoke с параметрами строки запроса И телом поста
Я довольно новичок в веб-сервисах и особенно в WCF, так что терпите меня.
Я пишу API, который принимает несколько параметров, таких как имя пользователя, apikey и некоторые параметры, но мне также нужно отправить ему строку, которая может состоять из нескольких тысяч слов, которая обрабатывается и передается обратно в виде потока. Не имело смысла просто помещать его в строку запроса, поэтому я подумал, что просто отправлю тело сообщения в службу.
Кажется, нет простого способа сделать это...
Мой рабочий контракт выглядит так
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate="Method1?email={email}&apikey={apikey}"+
"&text={text}&quality={qual}", BodyStyle = WebMessageBodyStyle.Bare)]
Stream Method1(string email, string apikey, string text, string qual);
И это работает. Но это текстовый параметр, который я хочу вывести и поместить в текст сообщения. Одна вещь, которую я прочитал, говорит, что у потока есть другой параметр, например так:
Stream Method1(string email, string apikey, string qual, Stream text);
который я мог тогда прочитать. Но это выдает ошибку, говорящую, что если я хочу иметь параметр потока, то это должен быть единственный параметр.
Итак, как мне достичь того, что я пытаюсь сделать здесь, или нет ничего сложного в том, чтобы отправить несколько тысяч слов в строке запроса?
2 ответа
Лучший ответ, который я смог найти, который решает эту проблему и работает для меня, чтобы я мог правильно придерживаться стандартов RESTful
Обходной путь - не объявлять параметры запроса в сигнатуре метода, а просто вручную извлекать их из необработанного uri.
Dictionary<string, string> queryParameters = WcfUtils.QueryParameters();
queryParameters.TryGetValue("email", out string email);
// (Inside WcfUtils):
public static Dictionary<string, string> QueryParameters()
{
// raw url including the query parameters
string uri = WebOperationContext.Current.IncomingRequest.UriTemplateMatch;
return uri.Split('?')
.Skip(1)
.SelectMany(s => s.Split('&'))
.Select(pv => pv.Split('='))
.Where(pv => pv.Length == 2)
.ToDictionary(pv => pv[0], pv => pv[1].TrimSingleQuotes());
}
// (Inside string extension methods)
public static string TrimSingleQuotes(this string s)
{
return (s != null && s.Length >= 2 && s[0] == '\'' && s[s.Length - 1] == '\'')
? s.Substring(1, s.Length - 2).Replace("''", "'")
: s;
}