我正在尝试使用 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
我正在尝试为返回 cookie 的 Web API 方法编写集成测试。基于这个问题,我相信我需要设置 HttpClientHandler 的 CookieContainer。
然后,基于这个问题,我认为我需要将此 HttpClientHandler 设置为我的 HttpServer 实例的 InnerHandler,以便我可以链接处理程序。
问题是我仍然发现 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) 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) 我的目标是使用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
获取在控制器中找不到 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
我试图在命令行应用程序中取消通过共享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) 最近,我想出了单元测试来检查我的 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
当我使用 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)
我究竟做错了什么?还有另一种我不知道的设置内容语言的方法吗?
有一个外部 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) 我是泛型的新手,我正在尝试为我的项目创建一个通用的 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# ×10
.net ×2
asp.net-core ×1
asp.net-mvc ×1
c#-5.0 ×1
cookies ×1
ebay-api ×1
flurl ×1
generics ×1
http-headers ×1
postman ×1
rest ×1
restsharp ×1
self-hosting ×1
stream ×1
unit-testing ×1