在ServiceStack上设置Accept标头JsonServiceClient

时间:2018-05-11 16:06:09

标签: c# .net servicestack github-api

我正在使用ServiceStack.JsonServiceClient尝试使用Accept标头的自定义值发出URL请求,但无法找到拨打电话的方法。

服务调用是通过GitHub API检索存储库的主题。这是当前的预览功能,需要在接受标头上将其他信息作为自定义媒体类型发送。 (https://developer.github.com/v3/repos

我正在使用服务堆栈并对API端点进行C#.NET调用,而且我很难找到更新请求中的接受标头的适当方法。我尝试过两次蠢事。

  1. 使用标题创建HttpWebRequest并将其传递给客户端

            Uri uri = new Uri(requestUrl, UriKind.Absolute);
            HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(uri);
            webRequest.Accept = "application/vnd.github.mercy-preview+json";
    
            HttpWebResponse webResponse = client.Get<HttpWebResponse>(webRequest);
    

    requestUrlhttps://api.github.com/repos/{owner}/{repo}?access_token={token}形式的字符串。它成功创建了Uri和HttpWebRequest对象,但随后在client.Get上引发了异常,声称Invalid URI: The format of the URI could not be determined.

    使用字符串URL调用API:HttpWebResponse webResponse = client.Get<HttpWebResponse>(requestUrl);成功没有问题(但不传递自定义标头值)。

  2. 在客户端上设置标题。 client.AddHeaders会引发异常,因为Accept是受限制的标头。我一直无法找到任何其他方法直接在客户端设置标头(虽然这可能是最好的解决方案)。

  3. 谢谢,如果还有其他我可以提供的内容,请告诉我。

1 个答案:

答案 0 :(得分:2)

您可以在发送请求之前使用RequestFilter修改HttpWebRequest,例如:

var client = new JsonServiceClient(baseUrl) {
    RequestFilter = req => req.Accept = acceptHeader
};

注意:ServiceStack的C#/.NET Service Clients只能用于调用ServiceStack服务。要调用第三方API,您应该使用HTTP Utils,例如:

var body = url.GetStringFromUrl(requestFilter: req => {
    req.Accept = acceptHeader;
});