servicestack,C#,servicestack" /> servicestack,C#,servicestack" />

C# ServiceStack客户端Put请求和查询参数

C# ServiceStack客户端Put请求和查询参数,c#,servicestack,C#,servicestack,我在一个.Net项目中使用最新的ServiceStack客户端库,在发出PUT请求时遇到一些问题。 特别是,它似乎没有考虑RequestDto对象中定义的参数类型,并将所有参数都放在主体中(尽管参数被定义为type=“query”) 我的请求对象(自动生成)如下所示: [Route("/test/name", "PUT")] public partial class PutTestName : IReturn<PutTestNameResponse> { ///<sum

我在一个.Net项目中使用最新的ServiceStack客户端库,在发出PUT请求时遇到一些问题。 特别是,它似乎没有考虑RequestDto对象中定义的参数类型,并将所有参数都放在主体中(尽管参数被定义为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"});
我得到“未找到资源”异常作为回报

当我使用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谓词(如GETDELETE)发送参数,对于具有请求正文的谓词,例如POSTPUTServiceStack的
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 {...});