C# ServiceStack客户端Put请求和查询参数
我在一个.Net项目中使用最新的ServiceStack客户端库,在发出PUT请求时遇到一些问题。 特别是,它似乎没有考虑RequestDto对象中定义的参数类型,并将所有参数都放在主体中(尽管参数被定义为type=“query”) 我的请求对象(自动生成)如下所示:C# ServiceStack客户端Put请求和查询参数,c#,
servicestack,C#,
servicestack,我在一个.Net项目中使用最新的ServiceStack客户端库,在发出PUT请求时遇到一些问题。 特别是,它似乎没有考虑RequestDto对象中定义的参数类型,并将所有参数都放在主体中(尽管参数被定义为type=“query”) 我的请求对象(自动生成)如下所示: [Route("/test/name", "PUT")] public partial class PutTestName : IReturn<PutTestNameResponse> { ///<sum
[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"});
我得到“未找到资源”异常作为回报
当我使用Postman手动运行查询时(并将这两个参数都放在Querystring中),它工作正常
在用fiddler调试C#client时,我可以看到没有为查询字符串设置任何参数,它们都在主体中传递
编辑:这是Fiddler请求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管理,但我认为这不是问题所在。客户端代码正在设置正文中的参数,而这些参数本应在查询中。如果相同的请求与POST一起工作,则很可能是WebDav已启用,并干扰了PUT请求,在这种情况下,您应该这样做,以便请求可以不受阻碍地到达ServiceStack 对于调试HTTP互操作性问题,您应该使用诸如Chrome Web Inspector或之类的工具检查(并在此处提供)原始HTTP响应头。如果HTTP响应标头不包含
X-Powered-By:ServiceStack..
标头,则请求很可能在到达ServiceStack之前被拦截和阻止,例如IIS/ASP.NET或转发代理
客户端代码正在设置主体中的参数,同时
应该在查询中
ServiceStack仅在正文中为没有请求正文的HTTP谓词(如GET或DELETE)发送参数,对于具有请求正文的谓词,例如POST或PUTServiceStack的JsonServiceClient
将按预期发布JSON
ServiceStack服务将接受在QueryString、JSON请求正文或x-www-form-urlencoded内容类型中发布的参数。如果你没有调用ServiceStack服务,你应该像一个允许你控制的服务,例如:
将以x-www-form-urlencoded的形式发送结果
仅用于向ServiceStack服务发送请求。@Etienne您只添加了HTTP请求头,HTTP响应头是什么样子的?我认为这无关紧要,如果我使用PostMan发出相同的请求并将参数放入查询中,我会得到正确的结果。如果我把它们放在身体里,我会得到404。我遗漏了什么吗?@Etienne如果这不是ServiceStack服务,你就不应该使用ServiceStack的
JsonServiceClient
。你可以使用一个通用的HTTP客户端,比如。它实际上不是一个ServiceStack(ServiceStack可以存在于Azure API管理的背后吗?)我很抱歉,谢谢lot@Etienne密切关注下一个v4.5.8版本的AutoRest/Azure API管理支持:)
var response = absoluteUrl.ToPutUrl(new PutTestName {...});