是否有处理cookie的C#rest客户端?

时间:2010-11-08 16:57:22

标签: c# rest cookies

我正在尝试构建一个c#控制台应用程序来测试一个使用cookie来处理各种事情的休息服务。我一直在尝试使用hammock,但它似乎无法管理Cookie。

是否有管理cookie的c#rest客户端?

4 个答案:

答案 0 :(得分:2)

此外,RestSharp支持自动cookie管理。它使用HttpWebRequest并使用CookieContainer在内部执行此操作。要支持此功能,您只需在创建共享IRestClient.CookieContainer时设置IRestClient属性:

var client = new RestClient("http://api.server.com/")
{
    CookieContainer = new CookieContainer();
};

完成此操作后,对Execute / Execute<T> / ExecuteAsync / ExecuteAsync<T>的后续调用将按预期处理Cookie。

答案 1 :(得分:1)

你能使用HttpWebReqest吗?如果是,则使用CookieContainer类进行cookie处理。

有关详细信息,请参阅此相关问题:Automatic Cookie Handling C#/.NET HttpWebRequest+HttpWebResponse

答案 2 :(得分:1)

您可以在Hammock上处理Cookie。虽然它在代码中看起来并不自然,但它确实有效。您必须在每个响应上手动保存cookie,并在每个后续请求中对其进行处理。这是我在使用Web服务的类上使用的代码的一部分。在其他方法中,我不是调用RestClient.Request(),而是调用_Request(),以便每次发出一个请求时都会处理cookie。

using System.Collections.Specialized;
using Hammock;
using System.Net;

static class Server {
    private static RestClient Client;
    private static NameValueCollection Cookies;
    private static string ServerUrl = "http://www.yourtarget.com/api"; 

    private static RestResponse _Request(RestRequest request) {
        //If there was cookies on our accumulator...
        if (Cookies != null)
        {
            // inyect them on the request
            foreach (string Key in Cookies.AllKeys)
            request.AddCookie(new Uri(ServerUrl), Key, Cookies[Key]);
        }

        // make the request
        RestResponse response = Client.Request(request);

        // if the Set-Cookie header is set, we have to save the cookies from the server.
        string[] SetCookie = response.Headers.GetValues("Set-Cookie");

        //check if the set cookie header has something
        if (SetCookie.Length > 0)
        {
            // if it has, save them for future requests
            Cookies = response.Cookies;
        }

        // return the response to extract content
        return response;
    }
}

答案 3 :(得分:0)

我个人认为Steve Haigh's answer要容易得多,但如果你足够顽固,可以使用WebClient并使用HeadersResponseHeaders属性。其余的请求本身变得更加简单和更高级别,但cookie操作变得更加痛苦。

这让我觉得这是一次糟糕的交易,但我建议将其作为史蒂夫建议的替代品,你不喜欢这样做。

如果您想编写一个WebClient包装类来为您执行此操作,您可能会发现Jim's WebClient class有用作为起点。