Tag: httpcontent

HttpContent.ReadAsStringAsync导致请求挂起(或其他奇怪的行为)

我们正在构建一个高度并发的Web应用程序,最近我们已经开始广泛使用异步编程(使用TPL和async / await )。 我们有一个分布式环境,应用程序通过REST API(构建在ASP.NET Web API之上)相互通信。 在一个特定的应用程序中,我们有一个DelegatingHandler ,在调用base.SendAsync (即,在计算响应之后)将响应记录到文件中。 我们在日志中包含响应的基本信息(状态代码,标题和内容): public static string SerializeResponse(HttpResponseMessage response) { var builder = new StringBuilder(); var content = ReadContentAsString(response.Content); builder.AppendFormat(“HTTP/{0} {1:d} {1}”, response.Version.ToString(2), response.StatusCode); builder.AppendLine(); builder.Append(response.Headers); if (!string.IsNullOrWhiteSpace(content)) { builder.Append(response.Content.Headers); builder.AppendLine(); builder.AppendLine(Beautified(content)); } return builder.ToString(); } private static string ReadContentAsString(HttpContent content) { return content == null ? […]

如何使用自定义标头将任意JSON数据发送到REST服务器?

TL; DR – 如何使用auth标头将JSON字符串发送到REST主机? 我已经尝试了3种不同的方法,其中一种方法适用于匿名类型。 为什么我不能使用匿名类型? 我需要设置一个名为“Group-Name”的变量,连字符不是有效的C#标识符。 背景 我需要POST JSON但是无法获取正文和内容类型 function#1 – 使用匿名类型 内容类型和数据是正确的,但我不想使用匿名类型。 我想用一个字符串 static void PostData(string restURLBase, string RESTUrl, string AuthToken, string postBody) { HttpClient client = new HttpClient(); client.BaseAddress = new Uri(restURLBase); client.DefaultRequestHeaders.Add(“Auth-Token”, AuthToken); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“application/json”)); // StringContent content = new StringContent(postBody); var test1 = “data1”; var test2 = “data2”; var test3 […]

将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 } ); […]

HTTPErrorexception在服务器上运行webapi与在本地运行时不显示消息

我有一个在IIS7.5服务器上运行的webapi。 它有3个控制器,所有3个控制器都可用于从我的应用程序中的调用访问webapi。 我有一个错误,我的控制器的基类将其function公开,而不是保护。 这导致服务器抛出内部服务器错误500(因为抛出了无效的exception“找到了与请求匹配的多个操作”)。 我花了一段时间来深入研究它,因为它从未触发过我的webapi的日志记录。 从这里的讨论中,我发现发生的错误发生在Application_Error函数捕获它以记录它之前。 所以我将以下代码添加到我的webapi的global.asax中,现在我可以记录这样的错误。 但是,我现在的问题是,当我在运行我的webapi的本地机器上导致内部服务器错误500时,我得到一个日志,我希望看到它的“ExceptionMessage”“找到匹配的多个操作”请求“拼写为内部服务器错误的原因。 但是当将这个确切的代码部署到服务器并从那里使用webapi时,我的日志只显示“消息”:“发生错误”并且没有向我显示“ExceptionMessage”,即使我可以看到exception是使用PerfView抛出。 我只需要能够获取我的服务器日志以显示与本地日志显示的信息相同的信息。 public class ResponseExceptionTrapper : DelegatingHandler { protected override Task SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { return base .SendAsync(request, cancellationToken) .ContinueWith(response => { var result = response.Result; if (!result.IsSuccessStatusCode) { var exceptionResult = string.Format( “Response exception: \r\n Path({0}) \r\n Status({1}) \r\n”, request.RequestUri, result.StatusCode); if (result.Content != […]

使用HttpClient时如何在HttpContent中设置大字符串?

所以,我创建了一个HttpClient并使用HttpClient.PostAsync()发布数据。 我使用了HttpContent HttpContent content = new FormUrlEncodedContent(post_parameters) ; 其中post_parameters是键值对List<KeyValuePair> 问题是,当HttpContent有一个很大的值(一个图像转换为base64要传输)我得到一个URL太长的错误。 这是有道理的 – 因为url不能超过32,000个字符。 但是,如果不是这样,我如何将数据添加到HttpContent ? 请帮忙。

重试HttpClient不成功的请求

我正在构建一个给出HttpContent对象的函数,它将发出请求并在失败时重试。 但是我得到exception,说HttpContent对象在发出请求后被处理掉。 无论如何都要复制或复制HttpContent对象,以便我可以发出多个请求。 public HttpResponseMessage ExecuteWithRetry(string url, HttpContent content) { HttpResponseMessage result = null; bool success = false; do { using (var client = new HttpClient()) { result = client.PostAsync(url, content).Result; success = result.IsSuccessStatusCode; } } while (!success); return result; } // Works with no exception if first request is successful ExecuteWithRetry(“http://www.requestb.in/xfxcva” /*valid url*/, new […]