【问题标题】:ServiceStack: Send JSON string instead DTO via POSTServiceStack:通过 POST 发送 JSON 字符串而不是 DTO
【发布时间】:2015-08-18 08:19:42
【问题描述】:

我想使用 DTO 将字符串(JSON 格式)发送到我的网络服务。

var client = new JsonServiceClient(absoluteUrl);
client.Post<T>(absoluteUrl, data); 

但是,在将我的数据(DTO 对象)更改为 JSON 字符串之后,我收到了 ServiceStack 异常:内部服务器错误。看起来 ServiceStack Post/Send 方法更改了我的 JSON 请求。

有没有可能或者有什么办法可以避免?其他人有同样的问题吗?

更新 1:由于 OAuth 身份验证,我正在使用这种方法。我正在根据请求生成 HMAC。

谢谢。

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    您可以使用HTTP Utils 发送原始 JSON,例如:

    var response = absoluteUrl.PostJsonToUrl(data)
        .FromJson<T>();
    

    ServiceStack 的 .NET Service Clients 提供 Typed API 来发送 Typed Request DTO,它并不意味着 POST'ing 原始字符串,但我刚刚添加了对发送原始 stringbyte[]Stream in this commit 的支持现在您可以使用以下方式发送原始数据:

    var requestPath = request.ToPostUrl();
    
    string json = request.ToJson();
    var response = client.Post<GetCustomerResponse>(requestPath, json);
    
    byte[] bytes = json.ToUtf8Bytes();
    response = client.Post<GetCustomerResponse>(requestPath, bytes);
    
    Stream ms = new MemoryStream(bytes);
    response = client.Post<GetCustomerResponse>(requestPath, ms);
    

    此更改从 v4.0.43+ 开始可用,现在是 available on MyGet

    通过 HttpWebRequest 共享 Cookie

    要让不同的 HttpWebRequest 共享同一个“会话”,您只需要共享客户端 Cookie,例如使用JsonServiceClient 进行身份验证后,您可以通过将其分配为CookieContainer 来与HTTP Utils 共享cookie,例如:

    var response = absoluteUrl.PostJsonToUrl(data,
         requestFilter: req => req.CookieContainer = client.CookieContainer)
        .FromJson<T>();
    

    【讨论】:

    • 感谢您的回复。我使用 JsonServiceClient 的原因是因为我为每个请求生成一个令牌。我已经尝试过这种方法,但我得到了未经授权。我会用这个重要的细节更新我的帖子。
    猜你喜欢
    • 2020-06-02
    • 2021-04-18
    • 1970-01-01
    • 2018-06-10
    • 2016-07-19
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多