我在.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管理,但我不认为这是问题所在。客户端代码正在设置身体中的参数,而这些参数应该在查询中。
答案 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发送请求。