6

我对 Web 服务,尤其是 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);

然后我可以读入。但这会引发一个错误,说如果我想要一个流参数,它必须是唯一的参数。

那么我怎样才能在这里实现我想要做的事情,或者在查询字符串中发送几千个单词没什么大不了的?

4

3 回答 3

0

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 标准

于 2017-03-15T09:55:03.093 回答
0

一种解决方法是不在方法签名中声明查询参数,而是手动从原始 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;
}
于 2020-01-04T22:46:41.617 回答
-5

最终通过使用 WebServiceHostFactory 解决

于 2012-05-15T02:09:13.667 回答