标签: dotnet-httpclient

在WinRT的HttpClient类中使用Keep-Alive连接?

打开与服务器的连接时,我们的WinRT应用程序速度极慢.请求需要大约500毫秒才能运行.这阻碍了我们的一些场景.

在调试时,我们注意到当Fiddler处于活动状态时,请求要快得多 - 每个请求约100ms.稍后我们理解这是因为Fiddler在代理呼叫时使用了Keep-Alive连接,这使我们的代理呼叫更快.

我们以两种方式对此进行了双重检查.

  1. 我们将UseProxy设置为false,并观察到请求变回缓慢.
  2. 我们关闭了Fiddler的"重用连接"选项,并观察到请求恢复得很慢.

我们尝试通过Connection头启用keep-alive(.Connection.Add("Keep-Alive"))但这似乎没有任何影响 - 事实上,.NET组件似乎公然忽略了标头,并且没有按要求发送(再次通过Fiddler检查).

有谁知道如何在Windows 8,WinRT,HttpClient类中为请求设置keep-alive?

c# windows-8 windows-runtime dotnet-httpclient windows-store-apps

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

投射简单的通用对象

我有一个方法,我为简化使用HttpClient调用而创建.它使用方法HttpReponse.Content.ReadAsAsync().结果从API获取响应.

一切正常.我的方法看起来像这样:

    public static T ExecuteAPIGetRequest<T>(string url, Dictionary<string, string> parameters)
    {

        HttpClient client = new HttpClient();
        //basic authentication

        var t = new object();
        string baseURL =  "myurl"; 

        //Execute request
        HttpResponseMessage response = client.GetAsync(baseURL).Result;

        if (response.IsSuccessStatusCode)
        {
            return response.Content.ReadAsAsync<T>().Result;  
        }
        else
        {
            return (T)t;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果查询失败,它需要返回一个空类型的T.如果它是我编写的自定义类,这很好,但它不适用于像string或string []这样的对象.有任何想法吗?

干杯

大斑病

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

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

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

在使用.NET HttpClient类时,是否有一种简单的方法来格式化查询字符串?

我在不同的地方有一些代码,我有一个Dictionary<string,string>包含参数需要在查询字符串上.我有一些自己的代码用于格式化,以便它可以添加到URL的末尾.这个库里面有什么内容可以帮我吗?

c# dotnet-httpclient

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

同步并发HttpClient用法

我试图同步使用HttpClient但当我发出许多并发请求时它停止工作.我写了两个测试,一个用于异步使用,一个用于同步使用.TestMethod总是在4秒后返回响应.异步测试工作正常.几乎所有请求都在同步测试中超时,只有大约20个请求成功.我尝试使用单个HttpClient请求并HttpClient为每个新请求创建新实例.没有不同.也许它与这个僵局有关.

我使用VS2013与.NET Framework 4.5.1针对Framework 4.5.我通过NuGet得到了HttpClient:<package id="Microsoft.Net.Http" version="2.2.15" targetFramework="net45" />

我还不想HttpClient异步使用,因为这意味着我必须重写我的整个应用程序.我有什么想法在这里做错了吗?

// all 800 requests complete successfully
[Test]
public async void Asyncmethod()
{
    var sw = new Stopwatch();
    sw.Start();

    var client = new HttpClient();
    client.Timeout = TimeSpan.FromSeconds(15);

    var tasks = Enumerable.Range(0, 800).Select(x => Task.Run(async () =>
    {
        try
        {
            var swx = new Stopwatch();
            swx.Start();
            var response = await client.GetStringAsync("http://localhost:7002/TestMethod").ConfigureAwait(false);
            swx.Stop();
            Console.WriteLine(x + " " + response + " in …
Run Code Online (Sandbox Code Playgroud)

c# concurrency asynchronous c#-5.0 dotnet-httpclient

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

System.Net.Http丢失了吗?

我正在尝试运行Test.aspx:

<%@ Page language="c#" EnableViewState="true" ContentType="text/html" Async="true" %>

<script language="C#" runat="server">

    void Page_Load(Object Src, EventArgs E )
    {
        RegisterAsyncTask(new PageAsyncTask(BindData));
    }

    private async System.Threading.Tasks.Task BindData()
    {
        Response.Write("Hello?<br /><br />");

        using (System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient())
        {
            Response.Write(await httpClient.GetStringAsync("http://www.google.com"));
        }

        Response.Write("<br /><br />Is this thing on?<br /><br />");
    }

</script>
Run Code Online (Sandbox Code Playgroud)

并收到此错误:

Test.aspx(14): error CS0234: The type or namespace name 'Http' does not exist in the namespace 'System.Net' (are you missing an assembly reference?)
Run Code Online (Sandbox Code Playgroud)

System.Net.Http.dll程序集在

C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies
Run Code Online (Sandbox Code Playgroud)

在IIS管理器中,基本设置的应用程序池是ASP.NET …

asp.net async-await dotnet-httpclient

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

取消对'HttpClient.SendAsync()'的调用

可以取消拨打电话HttpClient.SendAsync()吗?

我发送的数据如下:

var requestMessage = new HttpRequestMessage(HttpMethod.Post, "some url");
var multipartFormDataContent = new MultipartFormDataContent();
// ... construction of the MultipartFormDataContent. It contains form data + picture file
requestMessage.Content = multipartFormDataContent;
var response = await client.SendAsync(requestMessage).ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

此代码完美无缺,但我需要能够根据用户需求取消请求.这可能吗?

我看到有一个超载SendAsync接受了CancellationToken但我不知道如何使用它.我也知道一个叫做的属性IsCancellationRequested,表明请求是否已被取消.但是,如何实际取消请求呢?

.net c# cancellation dotnet-httpclient

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

HttpClient 访问套接字应用程序

我开始使用 HttpClient,因为我认为我访问的服务是 REST 服务。原来它是一个运行在端口 80 上的 JSON 服务,但它是一个套接字应用程序。

HttpClient 打开远程端口,但是当它发送 JSON 请求时,它永远不会得到响应。我也最难让提琴手得到回复。但是我能够让 wget 和 curl 发送/接收响应。那时我与原始开发人员交谈,他提到它不是真正的“REST”服务,而只是一个发送/接收 JSON 的套接字应用程序。

我可以做些什么来调整 HttpClient 以访问套接字应用程序,还是我将不得不退后一步并使用 WebSockets?

这是发送/接收 JSON 数据包的测试代码。

        private async Task ProcessZone(string szIPAddress)
    {
        string responseData = string.Empty;

        Uri baseAddress = new Uri(@"http://" + szIPAddress + "/player");

        try
        {
            using (var httpClient = new HttpClient { BaseAddress = baseAddress })
            {
                var _req = new SendRequest();
                _req.id = "rec-100";
                _req.url = "/stable/av/";
                _req.method = "browse";

                var _json = JsonConvert.SerializeObject(_req);

                using (var content = …
Run Code Online (Sandbox Code Playgroud)

c# dotnet-httpclient

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

c#从HttpClient的模型对象构建URL编码查询

需要从HttpClient的模型对象构建URL编码查询

我的模型是

class SaveProfileRequest
{
    public string gName { get; set; }
    public string gEmail { get; set; }
    public long gContact { get; set; }
    public string gCompany { get; set; }
    public string gDeviceID { get; set; }
    public string Organization { get; set; }
    public string profileImage { get; set; }
    public string documentImagefront { get; set; }
    public string documentImageback { get; set; }
}

SaveProfileRequest request = new SaveProfileRequest() { gName = name, gEmail = …
Run Code Online (Sandbox Code Playgroud)

c# dotnet-httpclient

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

HttpClient.GetAsync一次只执行2个请求?

为什么HttpClient.GetAsync()/ PostAsync()/ SendAsync()等一次只能调度2个请求?

我通过以下方式测试了这个:

我有一个异步GET方法,在响应之前等待10秒钟没有阻塞.

public async Task<string> Get()
{
    var guid = Guid.NewGuid();
    System.Diagnostics.Trace.WriteLine($"{guid}: {DateTime.Now.ToLongTimeString()}: start");
    await Task.Delay(10000);
    System.Diagnostics.Trace.WriteLine($"{guid}: {DateTime.Now.ToLongTimeString()}: end");
    return "hello";
}
Run Code Online (Sandbox Code Playgroud)

如果我通过刷新多次从Chrome调用端点,我看到它们在我刷新后立即执行,并且我在10秒后收到响应:

39a20541-a2d6-4cd0-99cd-db0987e273e9: 5:32:44 PM: start
8326d829-28a6-48a2-9874-6506b79488af: 5:32:44 PM: start
aecfbb10-266c-46f8-be3b-bfc2fadf0775: 5:32:44 PM: start
78932f53-37a5-4f26-a56f-b3196256e1cf: 5:32:44 PM: start
39a20541-a2d6-4cd0-99cd-db0987e273e9: 5:32:54 PM: end
8326d829-28a6-48a2-9874-6506b79488af: 5:32:54 PM: end
aecfbb10-266c-46f8-be3b-bfc2fadf0775: 5:32:54 PM: end
78932f53-37a5-4f26-a56f-b3196256e1cf: 5:32:54 PM: end
Run Code Online (Sandbox Code Playgroud)

但是如果我在控制台应用程序中使用此代码进行调用:

var client = new HttpClient();
for (var ii = 0; ii < 10; ii++)
{
    client.GetAsync("http://localhost:50621/api/default");
}
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)

我看到这Console.ReadKey();是立即达到的,但是请求是两个两个执行 …

c# asynchronous async-await dotnet-httpclient

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