打开与服务器的连接时,我们的WinRT应用程序速度极慢.请求需要大约500毫秒才能运行.这阻碍了我们的一些场景.
在调试时,我们注意到当Fiddler处于活动状态时,请求要快得多 - 每个请求约100ms.稍后我们理解这是因为Fiddler在代理呼叫时使用了Keep-Alive连接,这使我们的代理呼叫更快.
我们以两种方式对此进行了双重检查.
我们尝试通过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
我有一个方法,我为简化使用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 []这样的对象.有任何想法吗?
干杯
大斑病
在 Windows 8 应用程序中使用休息服务发布方法的任何示例。请让我知道可能的链接。
microsoft-metro windows-8 windows-runtime dotnet-httpclient windows-store-apps
我在不同的地方有一些代码,我有一个Dictionary<string,string>包含参数需要在查询字符串上.我有一些自己的代码用于格式化,以便它可以添加到URL的末尾.这个库里面有什么内容可以帮我吗?
我试图同步使用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) 我正在尝试运行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 …
可以取消拨打电话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,表明请求是否已被取消.但是,如何实际取消请求呢?
我开始使用 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) 需要从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) 为什么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# ×8
async-await ×2
asynchronous ×2
windows-8 ×2
.net ×1
asp.net ×1
c#-5.0 ×1
cancellation ×1
concurrency ×1