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 ответа

Решение

Закончилось решение просто с помощью WebServiceHostFactory

https://social.msdn.microsoft.com/Forums/vstudio/en-US/e2d074aa-c3a6-4e78-bd88-0b9d24b561d1/how-to-declare-post-parameters-in-wcf-rest-contract?forum=wcf

Лучший ответ, который я смог найти, который решает эту проблему и работает для меня, чтобы я мог правильно придерживаться стандартов 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;
}
Другие вопросы по тегам