Tag: httpclient

如何将大型JSON对象直接序列化为HttpResponseMessage流?

有没有办法将大型JSON对象直接流式传输到HttpResponseMessage流? 这是我现有的代码: Dictionary hugeObject = new Dictionary(); // fill with 100,000 key/values. Each string is 32 chars. HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); response.Content = new StringContent( content: JsonConvert.SerializeObject(hugeObject), encoding: Encoding.UTF8, mediaType: “application/json”); 适用于较小的物体。 但是,调用JsonConvert.SerializeObject()将对象转换为字符串的过程会导致大对象出现有问题的内存峰值。 我想做相当于这里描述的反序列化 。

HttpClient响应无法刷新

我正在使用HttpClient与Web服务进行通信以进行发送/接收(以JSON格式响应)。 但我在接收数据时遇到了一些问题。 我每5分钟调用一次Web服务,使用HttpClient在我的Windows手机上刷新内容,但响应反复出现。 为了获得新的响应,我需要退出应用程序并再次呼叫服务。 HttpClient需要一些刷新或清除数据的过程吗? 我是否需要实施其他一些approch来每次获得新的刷新结果? 请建议。 以下是我的实施 public async Task GetMyData(string urlToCall) { try { using (HttpClient httpClient = new HttpClient()) { httpClient.Timeout = TimeSpan.FromMilliseconds(double.Parse(30000)); HttpRequestMessage request = new HttpRequestMessage(System.Net.Http.HttpMethod.Get, urlToCall); var response = await httpClient.SendAsync(request); if (response.StatusCode == HttpStatusCode.OK) { var responseString = await response.Content.ReadAsStringAsync(); return responseString; } else { return string.Empty; } […]

为什么HttpClient.PostAsync缓冲区响应?

最近我在.Net 4.5.1上使用HttpClients.PostAsync时遇到了性能问题。 最初服务器(Owin + WebApi)在发送之前缓冲响应。 这导致了巨大的内存使用开销(序列化响应大小> 1Gb)。 在我打开服务器上的响应流后,客户端字面上停止工作。 事实certificate,当从服务器读取响应时,原因是客户端上的缓冲区重新分配。 我检查了HttpClient实现,并在HttpClient.SendAsync方法中找到了这个有趣的部分: if (result.Content == null || completionOption == HttpCompletionOption.ResponseHeadersRead) { this.SetTaskCompleted(request, linkedCts, tcs, result); } else { this.StartContentBuffering(request, linkedCts, tcs, result); } 因此,当completionOption不ResponseHeadersRead时, ResponseHeadersRead响应总是被缓冲。 根据SendAsync文档 ,SendAsync的实现与意图一致。 现在,当PostAsync实现发送ResponseContentRead ,响应流总是在POST上缓冲。 所以问题是为什么PostAsync必须等待(和缓冲)整个响应才能在处理继续之前到达?

C#:带有POST参数的HttpClient

我使用下面的代码将POST请求发送到服务器: string url = “http://myserver/method?param1=1&param2=2” HttpClientHandler handler = new HttpClientHandler(); HttpClient httpClient = new HttpClient(handler); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url); HttpResponseMessage response = await httpClient.SendAsync(request); 我无法访问服务器进行调试,但我想知道,此请求是以POST还是GET发送的? 如果是GET,如何更改我的代码以将param1和param2作为POST数据发送(不在URL中)?

C#:HttpClient,上传多个文件时的文件上传进度为MultipartFormDataContent

我正在使用此代码上传多个文件,并且它运行良好。 它使用modernhttpclient库。 public async Task PostImages (int platform, string url, List imageList) { try { int count = 1; var requestContent = new MultipartFormDataContent (); foreach (var image in imageList) { var imageContent = new ByteArrayContent (image); imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse (“image/jpeg”); requestContent.Add (imageContent, “image” + count, “image.jpg”); count++; } var cookieHandler = new NativeCookieHandler (); […]

取消’HttpClient’POST请求

我在Windows Phone 8应用程序上使用HttpClient.PostAsync()上传图像。 用户可以选择通过UI按钮取消此上传。 要取消POST请求,我设置了CancellationToken 。 但这不起作用。 在取消请求之后,我看到仍然看到我的代理中发生了上传,很明显该请求被忽略了。 我的代码: using (var content = new MultipartFormDataContent()) { var file = new StreamContent(stream); file .Headers.ContentDisposition = new ContentDispositionHeaderValue(“form-data”) { FileName = “filename.jpg”, }; file.Headers.ContentType = new MediaTypeHeaderValue(“image/jpeg”); content.Add(file); await httpclient.PostAsync(new Uri(“myurl”, UriKind.Absolute), content, cancellationToken); } 另请注意,我有CancellationTokenSource的CancellationToken 。 用户单击“取消”按钮后,将调用tokensource.Cancel() 。 此外,我的测试用例中的图像是1到2 MB(不是那么大)。 那么,有没有办法取消HttpClient POST请求?

Asp.net Web Api重定向请求

我有一个Asp.net Web API项目,它有几种CRUD方法。 在这些方法之上,我想添加一个Authorization服务,该服务读取Authorization标头并阻止用户访问资源(如果他们未经授权)。 // Method on internal IP Project public class InternalController : ApiController { public void Create(CreateRequest request) { // implement the method } } // Method on public IP Project public class ExternalController : ApiController { public async Task Create(CreateRequest request) { // validate Authorization header and throw exception if not valid […]

HttpClient可以为GET请求发送内容或正文吗?

目前要向API接口发送参数化GET请求,我正在编写以下代码: api/master/city/filter?cityid=1&citycode=’ny’ 但我发现URL长度限制为2,083个字符。 为了避免这种情况,我想在内容体中以json格式发送参数以获取GET请求。 但是,我发现HttpClient的Get方法都不允许发送内容正文。 对于POST我可以看到HttpClient中有一个名为PostAsync的方法允许内容体。 有没有办法为不在URL中的GET请求发送参数以避免URL长度限制?

将HttpClient .NET 4.5的代码降级到.NET 4.0

我有这个代码在.NET 4.5中运行良好。 var handler = new HttpClientHandler(); handler.UseDefaultCredentials = true; handler.PreAuthenticate = true; handler.ClientCertificateOptions = ClientCertificateOption.Automatic; var client = new HttpClient(handler); client.BaseAddress = new Uri(“http://localhost:22678/”); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue(“application/json”)); var loginBindingModel = new LoginBindingModel { Password = “test01”, UserName = “test01” }; var response = await client.PostAsJsonAsync(“api/Account/Login”, loginBindingModel); response.EnsureSuccessStatusCode(); // Throw on error code. tokenModel = […]

Singleton httpclient vs创建新的httpclient请求

我想在我的Xamarin.Forms移动应用程序中使用HttpClient创建web服务层。 没有单一模式 单身模式 在第一种方法中,我在移动应用程序发出的每个新请求中创建新的http客户端对象。 这是我的代码 public HttpClient GetConnection() { HttpClient httpClient = new HttpClient(); httpClient.BaseAddress = new Uri(baseAddress); httpClient.Timeout = System.TimeSpan.FromMilliseconds(timeout); return httpClient; } 发布请求代码 public async Task PostAsync(String url, TRequest requestData) { HttpClient client = GetConnection(); String responseData = null; if (client != null) { String serializedObject = await Task.Run(() => JsonConvert.SerializeObject(requestData, _jsonSerializerSettings)); var […]