ServiceStack Client放置请求和查询参数

时间:2017-03-21 01:18:07

标签: c# servicestack

我在.Net项目中使用最新的ServiceStack客户端库,并且我在发出PUT请求时遇到了一些问题。 特别是它似乎没有考虑RequestDto对象中定义的参数类型,并将所有参数放在正文中(尽管param被定义为type =" query")。

我的请求对象(自动生成)如下所示:

[Route("/test/name", "PUT")]
public partial class PutTestName
: IReturn<PutTestNameResponse>
{
    ///<summary>
    ///the user id
    ///</summary>
    [ApiMember(Description = "the user id", ParameterType = "query")]
    public virtual string UserId { get; set; }

    ///<summary>
    ///the name
    ///</summary>
    [ApiMember(Description = "the name", ParameterType = "query")]
    public virtual string Name { get; set; }

}

我这样打电话:

_apiClient.Put(new PutTestName(){UserId ="xyz..", Name="Bob"});

我得到了#34;未找到资源&#34;例外情况。

当我使用Postman手动运行查询(并将两个参数放在Querystring中)时,它可以正常工作。

使用fiddler调试C#客户端时,我可以看到没有参数设置为查询字符串,它们都在正文中传递。

编辑:这就是Fiddler Request Raw的样子:

PUT https://xxxx/test/name HTTP/1.1
User-Agent: ServiceStack .NET Client 4.56
Accept-Encoding: gzip,deflate
Ocp-Apim-Subscription-Key: 783....
Content-Encoding: gzip
Accept: application/json
Content-Type: application/json
Host: xxx.net
Content-Length: 115
Expect: 100-continue
Connection: Keep-Alive

{"UserId":"xxx","Name":"Bob"}

ServiceStack API与我的通话之间有Azure API管理,但我不认为这是问题所在。客户端代码正在设置身体中的参数,而这些参数应该在查询中。

1 个答案:

答案 0 :(得分:2)

如果相同的请求适用于 POST ,则可能是WebDav已启用并干扰您的 PUT 请求,在这种情况下您应该{{3}所以请求可以无阻碍地到达ServiceStack。

要调试此类HTTP互操作性问题,您应使用disable WebDav,Chrome Web Inspector或Fiddler等工具检查(并在此处提供)原始HTTP响应标头。如果HTTP响应标头不包含X-Powered-By: ServiceStack..标头,则该请求可能在到达ServiceStack之前被截获并被阻止,例如, IIS / ASP.NET或转发代理。

  

客户端代码正在设置身体中的参数   应该在查询中。

对于具有请求主体的动词,例如,对于不具有 GET DELETE 的请求主体的HTTP动词,ServiceStack仅在正文中发送参数。 发布 PUT ServiceStack的JsonServiceClient将按预期POST JSON。

ServiceStack Services将接受在QueryString,JSON Request Body或 x-www-form-urlencoded Content-Type中发布的参数。如果您未调用ServiceStack服务,则应WireShark using a generic HTTP Client HTTP Utils,以便您控制exactly how the Request is sent,例如:

var response = absoluteUrl.ToPutUrl(new PutTestName {...});

将结果发送为 x-www-form-urlencoded

ServiceStack's .NET Service Clients仅用于向ServiceStack Services发送请求。