标签: dotnet-httpclient

PUT 请求导致 400 Bad Request

我正在尝试使用 HttpClient 对 Web API 方法发出 PUT 请求。几乎相同的 POST 请求按预期工作,但 PUT 请求会导致 400(错误请求)错误。我不确定我做错了什么。

这是我的 Web API 控制器代码:

public HttpResponseMessage Post(object val)
{
    Debug.WriteLine(val.ToString());
    return new HttpResponseMessage(HttpStatusCode.OK);
}

public HttpResponseMessage Put(int id, object val)
{
    Debug.WriteLine(id.ToString(), val.ToString());
    return new HttpResponseMessage(HttpStatusCode.OK);
}
Run Code Online (Sandbox Code Playgroud)

这是尝试调用这些方法的客户端代码。POST 请求如下所示:

var client = new HttpClient();
var content = log.ToJsonContent();
var address = new Uri(_webApiBaseAddress + "logs");

client.PostAsync(address, content).ContinueWith(requestTask =>
    {
        requestTask.Result.EnsureSuccessStatusCode();
    });
Run Code Online (Sandbox Code Playgroud)

不起作用的 PUT 请求如下所示:

var client = new HttpClient();
var content = log.ToJsonContent();
var address = new …
Run Code Online (Sandbox Code Playgroud)

c# restsharp http-status-code-400 asp.net-web-api dotnet-httpclient

3
推荐指数
1
解决办法
1万
查看次数

使用 Web API 自托管时如何从 HttpClientHandler.CookieContainer 获取 cookie?

我正在尝试为返回 cookie 的 Web API 方法编写集成测试。基于这个问题,我相信我需要设置 HttpClientHandler 的 CookieContainer。

HttpClient 不保存 Cookie

然后,基于这个问题,我认为我需要将此 HttpClientHandler 设置为我的 HttpServer 实例的 InnerHandler,以便我可以链接处理程序。

如何执行 HttpClientHandler 的内存测试

问题是我仍然发现 CookieContainer 是空的。我有一个断言,用于验证响应中是否有包含我期望的 cookie 的标头。这是我的代码:

        // Set up in-memory hosting of Web API
        var config = new HttpConfiguration();
        WebApiConfig.Register(config);

        var cookieJar = new CookieContainer();
        var httpClientHandler = new HttpClientHandler
        {
            CookieContainer = cookieJar,
            UseCookies = true                
        };
        var httpServer = new HttpServer(config)
        {
            InnerHandler = httpClientHandler
        };

        const string loginUrl = "http://localhost/api/authentication/login";
        var uri = new Uri(loginUrl);

        var client …
Run Code Online (Sandbox Code Playgroud)

c# cookies self-hosting asp.net-web-api dotnet-httpclient

3
推荐指数
1
解决办法
4350
查看次数

如何使用 FluUrl 执行 XML POST

FlUrl在处理 Json/UrlEncoded 请求方面做得很好。然而,文档并没有真正指出如何处理其他请求类型,例如text/xml.

使用 FlUrl 执行 XML POST 的最佳方式是什么?

这(访问底层HttpClient)有点违背了使用 FlUrl 的目的,因为您需要再次构建 URI 和内容:

var result = await "http://someUrl"
                   .AppendPathSegment(pathSegment)
                   .SetQueryParam("name", name)
                   .WithBasicAuth(_userName, _apiToken)
                   .HttpClient
                   .PostAsync(<uri>, <content>);
Run Code Online (Sandbox Code Playgroud)

c# c#-5.0 dotnet-httpclient flurl

3
推荐指数
1
解决办法
7139
查看次数

HttpClient.GetStreamAsync() 与自定义请求?

我的目标是使用HttpClient该类进行网络请求,以便我可以将响应写入文件(解析后)。因此我需要将结果作为Stream.

HttpClient.GetStreamAsync()仅将字符串requestUri作为参数。所以不可能用 custom HttpRequestHeader、 custom HttpMethod、 custom ContentType、 custom content 等来创建请求?

我看到HttpWebRequest有时会使用它,但在我的 PCL(Profile111)中没有Add用于Headers. 那么我可以使用HttpClient,我应该使用HttpWebRequest还是应该使用另一个类/库?

c# stream portable-class-library dotnet-httpclient xamarin.forms

3
推荐指数
1
解决办法
3967
查看次数

通过传递简单和复杂的参数来调用 web api

获取在控制器中找不到 http 资源或操作的错误消息。在 web api 中,我有一个 from body 和 from uri 参数。

[HttpPost]        
public IHttpActionResult processfields(
    [FromUri]string field1,
    [FromUri]string field2, 
    [FromBody] string field3, 
    [FromUri]string field4
){...}
Run Code Online (Sandbox Code Playgroud)

在客户端中,我想通过执行以下操作来调用 web api--

using (var client = new HttpClient())
{
    //set up client
    client.BaseAddress = new Uri(Baseurl);
    client.DefaultRequestHeaders.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));


     var values = new Dictionary<string, string>();
     values.Add("field1", field1);
     values.Add("field2", field2);
     values.Add("field3", field3);
     values.Add("field4", filed4);


     var jsonString = JsonConvert.SerializeObject(values);
     try
     {

         HttpResponseMessage Res = client.PostAsync("api/home/processfields", new StringContent(jsonString, Encoding.UTF8, "application/json")).Result;
         var result = Res.Content.ReadAsStringAsync();
     }
} …
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net-web-api dotnet-httpclient asp.net-web-api-routing

3
推荐指数
1
解决办法
2万
查看次数

使用 CancellationToken 和 Ctrl+C 取消多个 HttpClient 调用

我试图在命令行应用程序中取消通过共享HttpClient使用完整框架、.net 4.7.1、C# 7.3、VS 2017 发出的多个异步 Web 请求 (GET)。CancellationTokens

我的示例运行几个并行任务,每个任务都使用异步不断通过 Http 下载一些数据,GetAsync()ReadAsStringAsync()使用 example 得到相同的结果ReadAsByteArrayAsync()

终止是通过挂接Console.CancelKeyPress并取消我的CancellationTokenSource.

尽管由于某种原因这看起来很简单,但我无法理解它并想出一个产生可靠结果的解决方案。有时,一切都会按预期关闭,即所有任务都完成(取消),但更常见的是,不关闭只是看似挂起。在不使用调试器(带/不带 DEBUG)的情况下运行会终止应用程序,但不会以我预期的方式终止。任务越少意味着干净关闭的可能性越大。

当处于“挂起”状态时暂停调试中的所有线程似乎表明某些线程被卡住GetAsync(),但很难准确地看到发生了什么。

实际上,应用程序如何退出并不重要,但我想了解这一点,并能够一致地产生干净且受控的关闭,对我来说,使用这种构造似乎是可能的,但我很可能错过了一些细节。

using System;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace HttpClientAsyncTest
{
    class Program
    {
        static async Task<int> Main()
        {
            using (var cancellationTokenSource = new CancellationTokenSource())
            {
                Console.CancelKeyPress += (sender, a) =>
                {
                    Console.WriteLine("Stopped by user");
                    cancellationTokenSource.Cancel();
                };

                var task = RunAsync(cancellationTokenSource);
                Console.WriteLine("Running - …
Run Code Online (Sandbox Code Playgroud)

.net c# dotnet-httpclient

3
推荐指数
1
解决办法
1909
查看次数

如何在 ASP.NET Core 中测试 https 重定向?

最近,我想出了单元测试来检查我的 ASP.NET Core 2.1 应用程序的一些重定向规则:

[Fact(DisplayName = "lowercase path")]
public async Task LowercaseRedirect()
{
    var result = await this.Client.GetAsync("/BLOG/");
    Assert.EndsWith("/blog/", result.RequestMessage.RequestUri.PathAndQuery, StringComparison.InvariantCulture);
}

[Fact(DisplayName = "add missing slash")]
public async Task SlashRedirect()
{
    var result = await this.Client.GetAsync("/blog");
    Assert.EndsWith("/blog/", result.RequestMessage.RequestUri.PathAndQuery, StringComparison.InvariantCulture);
}
Run Code Online (Sandbox Code Playgroud)

仅供参考:我目前正在将 注入WebApplicationFactory<TEntryPoint>到我的测试类中,我用它来创建我的HttpClient.

但现在我很好奇如何检查 https 重定向是否有效。任何想法如何做到这一点?提前致谢 :)

c# unit-testing dotnet-httpclient asp.net-core asp.net-core-2.1

3
推荐指数
1
解决办法
2902
查看次数

调用 Ebay API 时,Content-Language 标头会抛出 Misused header name 错误

当我使用 Ebay API 向 CreateOrReplaceInventoryItem 发出 PUT 请求时,出现以下错误:

误用标头名称。确保请求标头与 HttpRequestMessage 一起使用,响应标头与 HttpResponseMessage 一起使用,内容标头与 HttpContent 对象一起使用。

下面的代码抛出错误。

using (var client = new HttpClient())
{
    var baseUri = new Uri(string.Format("https://api.sandbox.ebay.com/sell/inventory/v1/inventory_item/{0}", SKU));
    client.DefaultRequestHeaders.Add("Authorization", string.Format("Bearer {0}", token));
    client.DefaultRequestHeaders.Add("Content-Language", "en-US");

    var payload = JsonConvert.SerializeObject(product);
    var content = new StringContent(payload, Encoding.UTF8, "application/json");

    var response = client.PutAsync(baseUri, content).Result;
    return response.Content.ReadAsStringAsync().Result;
}
Run Code Online (Sandbox Code Playgroud)

如果我删除该行:

client.DefaultRequestHeaders.Add("Content-Language", "en-US");
Run Code Online (Sandbox Code Playgroud)

然后我得到一个返回的错误对象:

errors":[{"errorId":25709,"domain":"API_INVENTORY","subdomain":"Selling","category":"REQUEST","message":"Invalid value for header Content-Language."}]} 
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?还有另一种我不知道的设置内容语言的方法吗?

c# rest http-headers dotnet-httpclient ebay-api

3
推荐指数
1
解决办法
7362
查看次数

HTTP POST 请求在 Postman 中有效,但在代码中无效

有一个外部 API,我必须向它发布一些对象才能获取一些数据。

我在 Postman 中尝试过,效果很好,如下所示:

在此处输入图片说明

我也在用 C# 编写的 ASP.NET MVC 应用程序中进行了尝试:

public class TestingController : SurfaceController
{
    [System.Web.Http.HttpGet]
    public async System.Threading.Tasks.Task<ActionResult> Hit()
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));

        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

        Order order = new Order();
        ClientDetailsModel ClientDetails = new ClientDetailsModel();
        ProductDetailsModel ProductDetails = new ProductDetailsModel();
        ShippingAdressModel ShippingAdress = new ShippingAdressModel();

        ClientDetails.ClientName = "x";
        ClientDetails.Email = "x";
        ClientDetails.Note = "x";
        ClientDetails.Tel = "x";

        ProductDetails.ColorID = "1";
        ProductDetails.Quantity = "1";
        ProductDetails.SizeID = "1";
        ProductDetails.ProductMatrixRecordID = "1";

        ShippingAdress.City = "x"; …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc dotnet-httpclient postman

3
推荐指数
1
解决办法
8818
查看次数

C# 和泛型:如何处理基于类型的处理?

我是泛型的新手,我正在尝试为我的项目创建一个通用的 HTTP GET 方法(并可能扩展它以处理 POST/PUT)。当响应基于字符串时,以下内容似乎可以正常工作:

private async Task<T> HttpGetAsync<T>(Uri uri)
{
    var httpRequestMessage = new HttpRequestMessage()
    {
        Method = HttpMethod.Get,
        RequestUri = uri,
        Headers =
        {
            { "Authorization", $"Basic {encodedCredentials}"},
            { "Cache-Control", "no-cache" }
        }
    };

    var response = await _httpClient.SendAsync(httpRequestMessage);
    var content = await response.Content.ReadAsStringAsync();
    return JsonConvert.DeserializeObject<T>(content);
}
Run Code Online (Sandbox Code Playgroud)

但在某些情况下,根据类型,我希望使用 ReadAsByteArrayAsync() 或 ReadAsStreamAsync() 而不是 ReadAsStringAsync() 读取响应。

我认为我可以在方法中执行 getType() 并使用适当的方法读取响应,但我想知道是否有更好的方法来做到这一点?

一般来说,这是一个坏主意/泛型的错误用法吗?感谢您提供任何信息!

c# generics dotnet-httpclient

3
推荐指数
1
解决办法
70
查看次数