首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有一种更优雅/更干净的方式来使用TryAddWithoutValidation方法来设置HttpRequestMessage头?

有没有一种更优雅/更干净的方式来使用TryAddWithoutValidation方法来设置HttpRequestMessage头?
EN

Stack Overflow用户
提问于 2020-07-22 09:21:02
回答 3查看 266关注 0票数 0

我在几个方法中使用了HttpClient中的HttpRequestMessage,目前,我在我的代码中重复了以下代码:

这段代码是由https://curl.olsh.me/转换的,所以我不确定这里是否使用了最佳实践。

代码语言:javascript
运行
复制
// using System.Net.Http;
using (var httpClient = new HttpClient(handler))
 {
     using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://www.url.com/"))
                {
                    request.Headers.TryAddWithoutValidation("authority", "www.url.com");
                    request.Headers.TryAddWithoutValidation("pragma", "no-cache");
                    request.Headers.TryAddWithoutValidation("cache-control", "no-cache");
                    request.Headers.TryAddWithoutValidation("dnt", "1");
                    request.Headers.TryAddWithoutValidation("x-requested-with", "XMLHttpRequest");
                    request.Headers.TryAddWithoutValidation("x-odesk-csrf-token", "19b91748869456a4ae700ffb69077745");
                    request.Headers.TryAddWithoutValidation("user-agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36");
                    request.Headers.TryAddWithoutValidation("accept", "*/*");
                    request.Headers.TryAddWithoutValidation("origin", "https://www.url.com");
                    request.Headers.TryAddWithoutValidation("sec-fetch-site", "same-origin");
                    request.Headers.TryAddWithoutValidation("sec-fetch-mode", "cors");
                    request.Headers.TryAddWithoutValidation("sec-fetch-dest", "empty");
                    request.Headers.TryAddWithoutValidation("referer", "https://www.url.com/");
                    request.Headers.TryAddWithoutValidation("accept-language", "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7,fr-FR;q=0.6,fr;q=0.5");
                    request.Headers.TryAddWithoutValidation("cookie", "G_AUTHUSER_H=1; AccountSecurity_cat=fc4d14f1.oauth2v2_812293");
                    request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

                    var response = await httpClient.SendAsync(request);

                    IEnumerable<string> cookies = new List<string>();
                    response.Headers.TryGetValues("Set-Cookie", out cookies);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-12 04:46:35

非常感谢@Jaquez和@Kuroiyatsu的回答,我得到了以下两个答案

代码语言:javascript
运行
复制
 public async Task<string> postAsync(param1, param2)
{
    using (var httpClient = new HttpClient(handler))
    {
        using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://www.url.com/"))
        {

....

var response = await PostAsync(param1, param2);

var variable = JsonSerializer.Deserialize<Obj>(response);

WebScrapFunc(response);

...

虽然从PostAsync返回一个Task<string>看起来很奇怪,但它很符合我的意图。

票数 0
EN

Stack Overflow用户

发布于 2020-07-22 10:07:13

我假设您正在尝试理解如何将有问题的代码提取到帮助器方法中,因为它使用了块。如果没有,请澄清,我会调整我的答案。在这种情况下,我会这样做:

代码语言:javascript
运行
复制
Task<HttpResponseMessage> PostAsyncWithHeaders(Uri uri)
{
    var response = new Task<HttpResponseMessage>();

    using (var httpClient = new HttpClient(handler))
    using (var request = new HttpRequestMessage(HttpMethod.Post, uri))
    {
        //Add your headers as before

        response = await httpClient.SendAsync(request);
    }

    return response;
}

然后,您可以从任何可以访问的地方调用该方法,如下所示:

代码语言:javascript
运行
复制
response = await PostAsyncWithHeaders(new Uri("https://www.url.com/"));

IEnumerable<string> cookies = new List<string>();
response.Headers.TryGetValues("Set-Cookie", out cookies);
//Presumably consume cookies (yum!)
票数 0
EN

Stack Overflow用户

发布于 2020-07-22 10:17:55

我在.NET Core3中做了这个测试,以供参考。

如果你想在整个代码库中重用你的方法,你可以尝试下面这样的方法:

代码语言:javascript
运行
复制
 static async Task Main(string[] args)
    {
        var client = new HttpClient();

        // .NET core setting the content type.
        client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json; charset=utf-8");

        // this is wrapped in the using statement.
        using var requestMessage = GetRequestMessage("https://www.url.com/", HttpMethod.Post);
        await client.SendAsync(requestMessage);
    }

    // Get the request message for reuse. You can then reuse this for maybe different end-points and method types. 
    // the "referer" or "origin" values can be passed in as parameters too. 
    static HttpRequestMessage GetRequestMessage(string url, HttpMethod method)
    {
        var request = new HttpRequestMessage(method, url);

        request.Headers.TryAddWithoutValidation("authority", "www.url.com");
        request.Headers.TryAddWithoutValidation("pragma", "no-cache");
        request.Headers.TryAddWithoutValidation("cache-control", "no-cache");
        request.Headers.TryAddWithoutValidation("dnt", "1");
        request.Headers.TryAddWithoutValidation("x-requested-with", "XMLHttpRequest");
        request.Headers.TryAddWithoutValidation("x-odesk-csrf-token", "19b91748869456a4ae700ffb69077745");
        request.Headers.TryAddWithoutValidation("user-agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36");
        request.Headers.TryAddWithoutValidation("accept", "*/*");
        request.Headers.TryAddWithoutValidation("origin", "https://www.url.com");
        request.Headers.TryAddWithoutValidation("sec-fetch-site", "same-origin");
        request.Headers.TryAddWithoutValidation("sec-fetch-mode", "cors");
        request.Headers.TryAddWithoutValidation("sec-fetch-dest", "empty");
        request.Headers.TryAddWithoutValidation("referer", "https://www.url.com/");
        request.Headers.TryAddWithoutValidation("accept-language", "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7,fr-FR;q=0.6,fr;q=0.5");
        request.Headers.TryAddWithoutValidation("cookie", "G_AUTHUSER_H=1; AccountSecurity_cat=fc4d14f1.oauth2v2_812293");
        
        return request;
    }

如果您在控制台程序中使用它,则可以在using语句中创建HttpClient。但是,如果您打算在.net核心中的web应用程序中使用客户端,则需要使用services.AddHttpClient方法和依赖项注入。这是因为HttpClient并不打算在每次使用之后都处理掉,特别是如果您在给定的调用中多次使用它的话。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63025360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档