我在HttpClient上设置Content-Type时遇到问题.我按照这个问题:如何为HttpClient请求设置Content-Type标头? 但仍然没有运气.
String rcString = JsonConvert.SerializeObject(new RoadsmartChecks() { userguid = user_guid, coords = coordinates, radius = (radius * 100) + "" }, ROADSMART_JSON_FORMAT, JSONNET_SETTINGS);
HttpClient c = new HttpClient();
c.BaseAddress = new Uri(BASE_URL);
c.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); //Keeps returning false
c.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", hash_aes);
c.DefaultRequestHeaders.TryAddWithoutValidation("Roadsmart-app", Constant.APP_ID);
c.DefaultRequestHeaders.TryAddWithoutValidation("Roadsmart-user", user_guid);
c.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, BASE_URL + URL_CHECKS + "/fetch");
req.Content = new StringContent(rcString);
await c.SendAsync(req).ContinueWith(respTask =>
{
Debug.WriteLine("Response: {0}", respTask.Result);
});
Run Code Online (Sandbox Code Playgroud)
我也试过使用Flurl库,但在尝试添加'Content-Type'时它崩溃了.
misused header name content-type
Run Code Online (Sandbox Code Playgroud)
那么我该如何强制它以便真正添加呢?提前致谢.
我正在尝试上传包含正文内容的文件.是PostMultipartAsync唯一的方法吗?
在我的C#后端代码中我有这个:
var resource = FormBind<StorageFileResource>();
var file = Request.Files.First().ToPostedFile();
Run Code Online (Sandbox Code Playgroud)
FormBind 从请求中读取数据并填充对象.
通过使用PostMultipartAsync我知道它应该像这样开始:
.PostMultipartAsync((mp) => { mp.AddFile(name, stream, name)}),但我无法弄清楚如何添加对象.你有什么想法吗?
这是我目前的尝试:
public static async Task<T> PostFileAsync<T>(string url, object data, string name, Stream stream, object queryString = null)
where T : class
{
return await HandleRequest(async () => queryString != null
? await url
.SetQueryParams(queryString)
.SetClaimsToken()
.PostMultipartAsync((mp) => { mp.AddFile(name, stream, name)})
.ReceiveJson<T>()
: await url
.SetClaimsToken()
.PostMultipartAsync((mp) => mp.AddFile(name, stream, name))
.ReceiveJson<T>());
}
Run Code Online (Sandbox Code Playgroud)
目前正在提出的要求:
我正在创建一个客户端向服务器发出请求的应用程序.服务器使用flurl.Http以node.js和.NET中的客户端编写.
当服务器上的请求失败时,创建自定义错误消息总是有用的.像这样的东西:
request.respond(500, { message: "targetid is mandatory" });
Run Code Online (Sandbox Code Playgroud)
但是,这会在客户端调用FlurlHttpException,并且响应中的JSON信息会丢失.
当从服务器收到不成功的响应代码时,如何收到此JSON信息?
我有一个使用 Flurl 客户端的简单发布请求,我想知道如何使用 IP、端口、用户名和密码等信息使用代理发出此请求。
string result = await atc.Request(url)
.WithHeader("Accept", "application/json")
.WithHeader("Content-Type", "application/x-www-form-urlencoded")
.WithHeader("Host", "www.website.com")
.WithHeader("Origin", "http://www.website.com")
.PostUrlEncodedAsync(new { st = colorID, s = sizeID, qty = 1 })
.ReceiveString();
Run Code Online (Sandbox Code Playgroud) Flurl声明使用单例客户端是推荐的模式:
HttpClient旨在实例化一次,并在应用程序的整个生命周期中重复使用.特别是在服务器应用程序中,为每个请求创建一个新的HttpClient实例将耗尽重负载下可用的套接字数量.这将导致SocketException错误.
但是,自Asp.Net Core 2.1以来,Net Core 2.1中的HttpClient生命周期有更新规则.
当您使用HttpClientFactory请求HttpClient时,实际上每次都会获得一个新实例,这意味着我们不必担心会改变它的状态.此HttpClient可能(或可能不)使用池中的现有HttpClientHandler,因此使用现有的打开连接.
如何修改Flurl在引擎盖下使用IHttpClientFactory?我应该创建自定义Flurl settings.HttpClientFactory并通过MS IHttpClientFactory创建HttpClient吗?
我遇到了使用我的代码从API获得响应的问题,请求没有超时,它根本没有给我回复.我已经在我自己的API中创建了一个api端点,以返回json字符串,然后用"Firefox Poster"手动发布json数据,它运行正常.有了这个,我相信问题出现在我的代码中.
我得到了一个C#WebAPI,我正在开发它与Angular前端一起使用(这是有效的,它仅用于历史).在调用我的API时,我创建了对象"EnrollmentRequestDto"
public class EnrollmentRequestDto
{
/// <summary>
/// Context Information for the request. Contains the Ship-To, language code and timezone.
/// </summary>
[JsonProperty("requestContext")]
public RequestContextDto RequestContext { get; set; }
/// <summary>
/// Unique ID provided by DEP to reseller on provisioning DEP access. This would be the reseller's DEP ID if its posted by distributor OBO a reseller, and would be his own depResellerId if a reseller is posting for self.
/// </summary>
[JsonProperty("depResellerId")]
public string DepResellerId …Run Code Online (Sandbox Code Playgroud) 有谁知道如何使用 flurl 通过 url 编码形式发送带括号的字段?
示例:我想发送带有“foo”值的 foo[bar] 字段,如下所示
var response = await "https://server/request"
.WithHeader("Header1", "headerValue")
.PostUrlEncodedAsync(new
{
foo[bar] = "foo"
})
Run Code Online (Sandbox Code Playgroud) 我可以使用以下代码设置http代理:
public class CustomFlurlHttpClient : DefaultHttpClientFactory {
public override HttpClient CreateClient(Url url, HttpMessageHandler m) {
return base.CreateClient(url, CreateProxyHttpClientHandler("http://192.168.0.103:9090"));
}
private HttpClientHandler CreateProxyHttpClientHandler(string proxyUrl, string user = "", string passw = "") {
NetworkCredential proxyCreds = null;
var proxyUri = new Uri(proxyUrl);
proxyCreds = new NetworkCredential (user, passw);
var proxy = new WebProxy (proxyUri, false) {
UseDefaultCredentials = false,
Credentials = proxyCreds
};
var clientHandler = new HttpClientHandler {
UseProxy = true,
Proxy = proxy,
PreAuthenticate = true,
UseDefaultCredentials = false …Run Code Online (Sandbox Code Playgroud) 将Blazor从0.5.1(使用Flurl)更新到0.6.0后,通过flurl调用会抛出异常:
WASM: [Flurl.Http.FlurlHttpException] Call failed. Cannot invoke method
because it was wiped. See stack trace for details.
Run Code Online (Sandbox Code Playgroud)
该项目创建了一个HttpClientFactory,它可以让Blazor的HttpClient被Flurl使用:
使用HttpClientFactoryForBlazor使用Blazor的HttpClient(http)创建FlurlClient:
IFlurlClient c = new FlurlClient() { Settings = new Flurl.Http.Configuration.ClientFlurlHttpSettings { HttpClientFactory = new HttpClientFactoryForBlazor(http) }};
Run Code Online (Sandbox Code Playgroud)
使用FlurlClient(c)例如通过Flurl的扩展方法"IFlurlRequest.WithClient(c);"
private class HttpClientFactoryForBlazor : Flurl.Http.Configuration.IHttpClientFactory
{
private readonly HttpClient httpClient;
public HttpClientFactoryForBlazor(HttpClient httpClient)
{
this.httpClient = httpClient;
}
public virtual HttpClient CreateHttpClient(HttpMessageHandler handler)
{
return this.httpClient;
}
}
Run Code Online (Sandbox Code Playgroud)
所以,似乎这种方法不再起作用.
有谁知道如何使用Blazor 0.6.0制作Flurl?
Call-Stack是:
WASM: [Flurl.Http.FlurlHttpException] Call failed. Cannot invoke method because it was wiped. See …Run Code Online (Sandbox Code Playgroud) 我正在尝试访问我的 RESTful API 以从 MySQL 数据库中检索数据。在我的 C# WPF 项目中,一切都已设置并完美运行。但是当在 Xamarin Forms(为 Android 构建)中使用完全相同的代码时,我无法与我的服务器成功进行 SSL 握手。
我正在使用 Flurl.Http(使用 HttpClient)来建立连接,但在 jsonReader.Wait() 上出现异常:
var jsonReader = "https://example.com/my_api/api.php/records/my_table?order=id,desc&size=10"
.WithHeader("Accept", "application/json")
.WithBasicAuth("username", "password")
.GetJsonAsync<JsonRootObject>();
// Wait for completion.
jsonReader.Wait();
Run Code Online (Sandbox Code Playgroud)
这是我的 AggregateException:
System.AggregateException: One or more errors occurred. (Call failed. An error occurred while sending the request
GET https://example.com/my_api/api.php/records/my_table?order=id,desc&size=10) ---> Flurl.Http.FlurlHttpException: Call failed. An error occurred while …Run Code Online (Sandbox Code Playgroud)