Tag: httpclient

MVC 4 Web Api Post

我想从远程客户端插入,因为我需要通过http发送数据。 我可以正确使用getPerformances()和httpClient api/performances?date={0} 我想问一下我的postPorformances()实现是否正确以及是否如何从客户端调用它? 这是我的实施: public class PerformancesController : ApiController { // GET api/performances public IEnumerable getPerformances(DateTime date) { return DataProvider.Instance.getPerformances(date); } public HttpResponseMessage postPerformances(Performance p) { DataProvider.Instance.insertPerformance(p); var response = Request.CreateResponse(HttpStatusCode.Created, p); return response; } } public class Performance { public int Id {get;set;} public DateTime Date {get;set;} public decimal Value {get;set;} } 我试过这个,但我要注意: […]

使用HttpClient,如何防止自动重定向并获取原始状态代码并在301 的情况下转发Url

我有以下方法返回给定Url的Http status code : public static async void makeRequest(int row, string url) { string result; Stopwatch sw = new Stopwatch(); sw.Start(); try { using (HttpClient client = new HttpClient()) { HttpResponseMessage response = new HttpResponseMessage(); response = await client.GetAsync(url); // dump contents of header Console.WriteLine(response.Headers.ToString()); if (response.IsSuccessStatusCode) { result = ((int)response.StatusCode).ToString(); } else { result […]

从HRESULT获取exception:在Windows Phone 8.1中发布到服务时为0x80072F0D

当我尝试使用Windows Phone 8.1中的HttpClient将数据发布到API时,我总是Exception from HRESULT: 0x80072F0D得到Exception from HRESULT: 0x80072F0Dexception。 在小提琴手,它工作正常。 try { var requestbody=”json data” HttpClient httpClient = new HttpClient(); HttpRequestMessage msg = new HttpRequestMessage(new HttpMethod(“POST”), new Uri(addressUri)); msg.Content = new HttpStringContent(requestbody); msg.Content.Headers.ContentType = new HttpMediaTypeHeaderValue(“application/json”); HttpResponseMessage response = await httpClient.SendRequestAsync(msg).AsTask(); } catch (Exception ex) { getting **Exception from HRESULT: 0x80072F0D** } 请告诉我出了什么问题? — FYI […]

通过HttpClient使用外部REST Web服务的存储库模式示例?

我已经搜索了很多,但没有找到任何使用存储库模式在ASP.NET MVC应用程序中使用外部REST Web服务的良好示例,具有松散耦合和有意义的关注点分离。 我在网上找到的几乎所有存储库模式的例子都是编写SQL数据或使用ORM。 我只想看一些使用HttpClient检索数据但包装在存储库中的示例。 有没有提到好的例子? 或者有人可以写一个简单的例子吗?

使用语句中的HttpClient导致任务被取消

我为我的api调用创建了一个FileResult : IHttpActionResult webapi返回类型。 FileResult从另一个URL下载文件,然后将流返回给客户端。 最初我的代码有一个如下所示的using语句: public async Task ExecuteAsync(CancellationToken cancellationToken) { try { HttpResponseMessage response; using (var httpClient = new HttpClient()) { response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new System.Net.Http.StreamContent( await httpClient.GetStreamAsync(this.filePath)) }; } return response; } catch (WebException exception) {…} } 但是,这会间歇性地导致TaskCanceledException 。 我知道如果在异步调用完成之前处理了HttpClient,Task的状态将变为取消。 但是因为我使用了await : Content = new System.Net.Http.StreamContent(await httpClient.GetStreamAsync(this.filePath)) ,它应该阻止HttpClient在任务完成过程中被处理掉。 […]

C#如何将HttpClient Keep-Alive设置为false

我在.NET上的HTTP请求有一个低性能问题。 对localhost上的REST API的HTTP GET请求大约需要500毫秒才能完成。 我花了很多时间来解决它。 我尝试了很多方法: HttpClient , HttpWebRequest , WebClient和RestSharp 。 他们都没有工作。 互联网上的大多数解决方案都表示将Proxy参数设置为null但仍然无法更快地运行。 我发现减少这个时间的唯一方法是将请求的Keep-Alive参数设置为false: HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.Method = “GET”; request.KeepAlive = false; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 这很好用。 时间减少到7-10毫秒。 但现在由于某些原因,我需要使用HttpClient而不是HttpWebRequest 。 我无法找到如何为HttpClient设置Keep-Alive为false。 我发现的唯一一件事是如何通过将“连接”标题设置为“保持活动”来将其设置为true。 我在HttpClient上使用此代码进行POST请求: HttpClient _http = new HttpClient(); _http.DefaultRequestHeaders.Accept.Clear(); _http.DefaultRequestHeaders.Add(“Connection”, “Keep-Alive”); _http.DefaultRequestHeaders.Add(“Keep-Alive”, “timeout=600”); var content = new StringContent( request, Encoding.UTF8, “application/%appname%+xml”); content.Headers.ContentType.Parameters.Add( […]

HttpClient在使用语句中

嗨,我读到这篇文章你正在使用HttpClient错误,它正在破坏你的软件 ,文章建议这些2 使您的HttpClient静态 除非您明确要查找特定行为(例如导致服务失败),否则不要将HttpClient丢弃或包装在使用中 现在像我这样的c#上的新手会跟着它,就像这篇文章上发布的代码是原始代码,他说会使应用程序失败 using System; using System.Net.Http; namespace ConsoleApplication { public class Program { public static void Main(string[] args) { Console.WriteLine(“Starting connections”); for(int i = 0; i<10; i++) { using(var client = new HttpClient()) { var result = client.GetAsync("http://aspnetmonsters.com").Result; Console.WriteLine(result.StatusCode); } } Console.WriteLine("Connections done"); } } } 并修复它,他给了这个代码: using System; using System.Net.Http; namespace […]

如何使用HttpClient发布身份validation

我正在尝试使用HttpClient在C#中执行以下curl(适用于我)。 curl -X POST http://www.somehosturl.com \ -u : \ -d ‘grant_type=password’ \ -d ‘username=’ \ -d ‘password=’ \ -d ‘scope=all C#代码: HttpClientHandler handler = new HttpClientHandler { Credentials = new System.Net.NetworkCredential (“my_client_id”, “my_client_secret”) }; try { using(var httpClient = new HttpClient(handler)) { var activationUrl = “www.somehosturl.com”; var postData = “grant_type=password&username=myemail@myemail.com&password=mypass&scope=all”; var content = new StringContent(postData, […]

异步HttpListener每次接收两次请求

我在c#中实现了一个异步http监听器。 我按照微软提供的教程进行了操作 并发现另一个教程,我愚蠢地没有书签,现在再也找不到了。 这意味着我有一些我不会自己编写的代码,但提供的解释是有道理的,所以我遵循了这一点。 现在我面临两个问题: 首先,我必须在使用Listener.Stop()的每个请求之后重新启动侦听器,然后再次调用StartListening方法,其次,当我这样做时,我会收到两次请求。 请求发送net get两次,但我收到两次。 然而,当我暂停我正在收听的线程大约2秒时,它不会被接收两次。 我很抱歉,如果我的解释很模糊,但我对我的问题的理解也是如此,我不知道是什么导致了它。 由于回调方法是大多数事情发生的地方,我将发布它,请告诉我你是否需要更多的代码。 任何帮助都将很高兴,因为我真的被困在这一个。 public void ListenAsynchronously() { if (listener.Prefixes.Count == 0) foreach (string s in prefixes) listener.Prefixes.Add(s); try { listener.Start(); } catch (Exception e) { Logging.logException(e); } System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(Listen)); } private void Listen(object state) { while (listener.IsListening) { listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener); listenForNextRequest.WaitOne(); } } private void […]

HttpClient和PushStreamContent

我使用PushStreamContent和我的REST API(ASP.NET Web API)并且效果很好。 HttpClient可以请求资源并在服务器处理完整请求之前获取HTTP响应(服务器仍然写入推送流)。 作为HttpClient,你必须做一件小事:使用HttpCompletionOption.ResponseHeadersRead。 现在我的问题:是否有可能以另一种方式? 从HttpClient – >通过push-stream将数据上传到web api? 我在下面实现了它,但是web api在客户端关闭流之前没有收到请求。 var asyncStream = new AsyncStream(fs); PushStreamContent streamContent = new PushStreamContent(asyncStream.WriteToStream); content.Add(streamContent); HttpResponseMessage response = await c.SendAsync(new HttpRequestMessage(new HttpMethod(“POST”), “http://localhost/…”) { Content = content }, HttpCompletionOption.ResponseHeadersRead); response.EnsureSuccessStatusCode(); AsyncStream是我的代表类: public async void WriteToStream(Stream outputStream, HttpContent content, TransportContext context) 这对于Push-Stream是必要的。 这有可能吗? 在将最后一个字节写入流之前,HttpClient不会将请求发送到Web api … 我需要做什么? […]