带有查询字符串参数和post主体的WCF WebInvoke



对于web服务,尤其是WCF,我还是个新手,所以请耐心等待。

我正在编写一个API,它需要几个参数,如用户名,apikey和一些选项,但我还需要发送一个字符串,可以是几千字,它被操纵并作为流传递回来。把它放在查询字符串中是没有意义的,所以我想我只需要将消息体post到服务中。

似乎没有一个简单的方法来做到这一点…

我的操作合同是这样的

[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);

这行得通。但它是'text'参数我想拉出来,并在帖子主体。我读到的一件事说,有一个流作为另一个参数,像这样:

Stream Method1(string email, string apikey, string qual, Stream text);
我可以读入

。但是这会抛出一个错误,如果我想要一个流形参,它必须是唯一的形参。

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

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;
}

最终通过使用WebServiceHostFactory解决

最新更新