Tag: httpclient

C#HttpClient PostAsync将204变为404

鉴于此WebApi服务: [ActionName(“KillPerson”)] [HttpPost] public void KillPerson([FromBody] long id) { // Kill } 而这个HttpClient PostAsync调用: var httpClient = new HttpClient { BaseAddress = new Uri(ClientConfiguration.ApiUrl) }; httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“application/json”)); var serializerSettings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects, Formatting = Formatting.Indented, ReferenceLoopHandling = ReferenceLoopHandling.Serialize }; var serializedParameter = JsonConvert.SerializeObject(parameter, serializerSettings); var httpContent = new StringContent(serializedParameter, Encoding.UTF8, “application/json”); […]

如何使用HttpClient将带有JSON的DELETE发送到REST API

我必须使用HttpClient类向具有JSON内容的REST API服务发送删除命令,并且无法使其正常工作。 API调用: DELETE /xxx/current { “authentication_token”: “” } 因为我无法在下面的语句中添加任何内容: HttpResponseMessage response = client.DeleteAsync(requestUri).Result; 我知道如何使用RestSharp来完成这项工作: var request = new RestRequest { Resource = “/xxx/current”, Method = Method.DELETE, RequestFormat = DataFormat.Json }; var jsonPayload = JsonConvert.SerializeObject(cancelDto, Formatting.Indented); request.Parameters.Clear(); request.AddHeader(“Content-type”, “application/json”); request.AddHeader (“Accept”, “application/json”); request.AddParameter (“application/json”, jsonPayload, ParameterType.RequestBody); var response = await client.ExecuteTaskAsync (request); 但我没有RestSharp就完成了。

HttpClient不在CookieContainer中存储cookie

我正在使用VS2010 + .NET 4.0 + System.Net.Http (来自Nuget )。 由于我无法理解的原因,我在HttpResponseMessage收到的会话cookie不会自动保存在HttpClient CookieContainer 。 这是我的代码的样子: CookieContainer cookies = new CookieContainer(); HttpClientHandler handler = new HttpClientHandler(); handler.CookieContainer = cookies; HttpClient client = new HttpClient(handler); Uri site = new Uri(“https://www.mywebsite.com”); var response1 = client.SendAsync(new HttpRequestMessage(HttpMethod.Get,site)).Result; 我可以在响应头中看到我有以下内容: Set-Cookie: JSESSIONID=FC8110E434C2C6DAB78B4E335024A639; Path=/member; Secure 但是我的cookie容器仍然是空的…为什么?

将JSON HttpContent发布到ASP.NET Web API

我有一个托管的ASP.NET Web API,可以很好地访问http get请求,我现在需要将一些参数传递给PostAsync请求,如下所示: var param = Newtonsoft.Json.JsonConvert.SerializeObject(new { id=_id, code = _code }); HttpContent contentPost = new StringContent(param, Encoding.UTF8, “application/json”); var response = client.PostAsync(string.Format(“api/inventory/getinventorybylocationidandcode”), contentPost).Result; 此调用返回404 Not Found结果。 服务器端API操作如下所示: [HttpPost] public List GetInventoryByLocationIDAndCode(int id, string code) { … } 只是为了确认我在Web API上的路由如下所示: config.Routes.MapHttpRoute( name: “DefaultApiWithAction”, routeTemplate: “api/{controller}/{action}/{id}”, defaults: new { id = RouteParameter.Optional } ); […]

HttpClient – 处理聚合exception

嗨我正在使用类似这样的HttpClient: public static Task AsyncStringRequest(string url, string contentType) { try { var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(contentType)); return client.GetStringAsync(url).ContinueWith(task => { return task.Result; }); } catch (AggregateException ex) { throw ex; } catch (WebException ex) { throw ex; } catch (Exception ex) { throw ex; } } 但我在处理exception时遇到困难。 我添加了额外的catch块只是为了尝试并逐步抛出,但没有任何断点被捕获到任何catch块中。 我意识到使用Task,exception可能发生在与调用者不同的线程上,因此exception包含在聚合容器中,但我不确定处理这些exception的最佳方法是什么。 例如,我向Web服务发出请求,并在请求中指定了特定的无效参数,并抛出exception。 我希望我能够捕获聚合exception,并查看innerexceptions以找出请求失败的原因并返回友好消息。 所以我的问题是,捕获这些聚合exception并处理它们的最佳方法是什么?

尝试使用HttpClient上传文件时,Web Api的RequestEntityTooLarge响应

我正在尝试使用Asp.Net Web Api创建一个通过Post上传文件的Web服务。 这些分别是Client和Web Api的实现: 客户: using (var client = new HttpClient()) { client.BaseAddress = new Uri(“https://127.0.0.1:44444/”); using (var content = new MultipartFormDataContent(“Upload—-” + DateTime.Now.ToString(CultureInfo.InvariantCulture))) { content.Add(new ByteArrayContent(File.ReadAllBytes(filepath))); content.Headers.ContentType = new MediaTypeHeaderValue(“application/octet-stream”); var response = await client.PostAsync(“api/Synchronization”, content); if (response.IsSuccessStatusCode) eventLog1.WriteEntry(“Synchronization has been successful”, EventLogEntryType.Information); else eventLog1.WriteEntry(response.StatusCode + “:” + response.ReasonPhrase, EventLogEntryType.Error); } } 服务器: […]

使用.Result的异步方法

以下方法循环遍历postdata列表以对令牌发出多个请求,例如,每个请求都使用特定的clientID。 我的问题与异步有关。 我试图让令牌的调用是异步的。 使用.Result是否必然使方法同步? public async Task ReturnDataFromUrl1(List<List<KeyValuePair>> listOfPostData) { List<Task> taskList = new List<Task>(); string allTokens = “”; List<Task> downloadTasks = new List<Task>(); foreach (var postData in listOfPostData) { using (var client = new HttpClient()) { client.BaseAddress = new Uri(“http://localhost:23081”); HttpContent httpContent = new FormUrlEncodedContent(postData); HttpResponseMessage response = client.PostAsync(“/Token”, httpContent).Result; var responsecode = (int)response.StatusCode; […]

401在SECOND HttpClient / HttpWebRequest上调用未授权

我有一个使用SharePoint 2010 REST API的应用程序。 在创建项目的过程中,有多个请求在彼此之后完成: 1呼叫:从列表中获取项目:成功 2呼叫:创建项目:401未经授权 如果我这样做,这是相同的: 1呼叫:创建项目:成功 2呼叫:删除项目:401未经授权 我所知道的是,我的function是分开工作的,当它们相互呼叫时它们不起作用。 当我在创建项目后关闭应用程序(Windows Phone 8.1应用程序)并重新启动时尝试删除它的工作项目。 首先我认为它与处理我的字段的方式有关,所以我在finally语句中将它们更改为NULL但是这不起作用。 public async Task CreateNewItem(NewItem myNewItem) { try { StatusBar statusBar = await MyStatusBar.ShowStatusBar(“Creating new List Item.”); //Retrieving Settings from Saved file mySettings = await MyCredentials.GetMySettings(); myCred = new NetworkCredential(mySettings.UserName, mySettings.Password, mySettings.Domain); using (var handler = new HttpClientHandler { Credentials = […]

在HttpClient中设置HTTP协议版本

我需要向使用HTTP版本1.0的Web服务发出请求。 我使用HttpClient ,但我无法看到任何设置HTTP版本的选项。 我在哪里可以设置请求版本?

重用异步套接字:后续连接尝试失败

我正在尝试在异步HTTP客户端中重用套接字,但是第二次我无法连接到主机。 我基本上将异步HTTP客户端视为具有以下状态的状态机: 可用:sockets可供使用 连接:套接字连接到端点 发送:套接字正在向端点发送数据 接收:套接字正在从端点接收数据 失败:存在套接字故障 清理:清理sockets状态 在连接状态下,我调用BeginConnect : private void BeginConnect() { lock (_sync) // re-entrant lock { IPAddress[] addersses = Dns.GetHostEntry(_asyncTask.Host).AddressList; // Connect to any available address IAsyncResult result = _reusableSocket.BeginConnect(addersses, _asyncTask.Port, new AsyncCallback(ConnectCallback), null); } } 一旦建立成功连接,回调方法会将状态更改为Sending : private void ConnectCallback(IAsyncResult result) { lock (_sync) // re-entrant lock { try { […]