HttpClient-ThisInstanceHasBeenStarted我在api中使用http客户端得到这个异常。执行请求时发生未处理的异常。System.InvalidOperationException:该实例已经发起了一个或多个请求。只能在发送第一个请求之前修改属性。我用services.AddSingleton()注入了我的服务,我认为单例是我最好的选择。可能是我的问题?编辑:我的使用类ApiClient{privatereadonlyHttpClient_client;公共ApiClient(HttpClient客户端){_client=客户端;}publicasyncTaskGetAsync(stringuri){_client.BaseAddress=newUri("http://localhost:5001/");_client.DefaultRequestHeaders.Accept.Add(newMediaTypeWithQualityHeaderValue("application/json");varresponse=await_client.GetAsync(uri);returnresponse;}}这是HttpClient.NetCoreSource类的设计。这里有意思的方法是CheckDisposedOrStarted()。私人无效CheckDisposedOrStarted(){CheckDisposed();如果(_operationStarted){thrownewInvalidOperationException(SR.net_http_operation_started);现在,这个方法在设置属性BaseAddressTimeoutMaxResponseContentBufferSize时被调用,所以如果你打算重用HttpClient实例,你应该设置一个预设了这3个属性的实例,并且所有用户都不允许修改这些属性。或者,您可以创建工厂或使用简单的AddTransient(...)。请注意,AddScoped并不是这里的最佳选择,因为您将在每个请求范围内收到相同的实例。编辑基本工厂现在,工厂只不过是负责向另一个服务提供实例的服务。这是构建HttpClient的基础工厂现在意识到这只是最基本的你可以扩展这个工厂来做你想做的事并预设HttpClient的每个实例publicinterfaceIHttpClientFactory{HttpClientCreateClient();}publicclassHttpClientFactory:IHttpClientFactory{staticstringbaseAddress="http://example.com";publicHttpClientCreateClient(){varclient=newHttpClient();SetupClientDefaults(客户端);回头客;}protectedvirtualvoidSetupClientDefaults.HttpClientclient{Timeout=TimeSpan.FromSeconds(30);//设置你自己的timeout.client.BaseAddress=newUri(baseAddress);现在我为什么要使用和接口?这是使用依赖注入和IoC完成的,我们可以很容易地“交换”应用程序的各个部分。现在,我们不再尝试访问HttpClientFactory,而是访问IHttpClientFactory。服务.AddScoped();现在,在您的类、服务或控制器中,您将请求工厂接口并生成一个实例。publicHomeController(IHttpClientFactoryhttpClientFactory){_httpClientFactory=httpClientFactory;}只读IHttpClientFactory_httpClientFactory;publicIActionResultIndex(){varclient=_httpClientFactory.CreateClient();//....做你的代码返回}这里的关键是View();.工厂负责生成客户端实例和管理默认值。我们需要接口而不是实现。这有助于我们保持组件断开连接,并允许进行更加模块化的设计。该服务注册为Scoped实例。单身人士有其用途,但在这种情况下,您更可能需要一个范围内的实例。每个请求都会创建一个Scoped生命周期服务。单身人士是正确的选择。使用scoped或transient将阻止连接池并导致性能下降和端口耗尽。如果你有一个一致的默认值,你可以在注册你的服务时初始化一次:varclient=newHttpClient();client.BaseAddress=newUri("http://example.com/");客户端.DefaultRequestHeaders.Accept。添加(新的MediaTypeWithQualityHeaderValue(“应用程序/json”));服务。添加单例(客户端);…varincoming=newUri(uri,UriKind.Relative);//不要让用户指定绝对值。varresponse=await_client.GetAsync(incoming);如果没有一致的默认值,不应使用BaseAddress和DefaultRequestHeaders。而是新建一个HttpRequestMessage:以上是C#学习教程:HttpClient——本例开始分享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——varincoming=newUri(uri,UriKind.Relative);//不要让用户指定绝对url。varoutgoing=newUri(newUri("http://example.com/"),incoming);varrequest=newHttpRequestMessage(HttpMethod.Get,outgoing);request.Headers.Accept.Add(newMediaTypeWithQualityHeaderValue("application/json"));varresponse=await_client.SendAsync(request);本文收集自网络,不代表立场,如有侵权请点右联系管理员删除。如需转载请注明出处:
