Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对Web API的调用有时会起作用,但通常会在关闭连接时出错。令牌验证是否会导致问题?_C#_Owin_Dotnet Httpclient_Identityserver3 - Fatal编程技术网

C# 对Web API的调用有时会起作用,但通常会在关闭连接时出错。令牌验证是否会导致问题?

C# 对Web API的调用有时会起作用,但通常会在关闭连接时出错。令牌验证是否会导致问题?,c#,owin,dotnet-httpclient,identityserver3,C#,Owin,Dotnet Httpclient,Identityserver3,更新4更加混乱 我以为我发现了什么,但同样的错误不断出现。这个解决方案似乎很有希望,但不是100%,但它可能会帮助人们缩小问题的范围 步骤: 重新启动API和Identity Server IIS应用程序池 使用QA URL通过SoapUI获取访问令牌 使用SoapUI在QA中命中API 失败-不工作(请参阅下面的stacktrace) 使用SoapUI在本地命中API(使用相同的QA标识服务器URL) 本地API URL返回预期数据 使用SoapUI使用QA URL点击API(我只是在Soap

更新4更加混乱 我以为我发现了什么,但同样的错误不断出现。这个解决方案似乎很有希望,但不是100%,但它可能会帮助人们缩小问题的范围

步骤:

  • 重新启动API和Identity Server IIS应用程序池
  • 使用QA URL通过SoapUI获取访问令牌
  • 使用SoapUI在QA中命中API
  • 失败-不工作(请参阅下面的stacktrace)
  • 使用SoapUI在本地命中API(使用相同的QA标识服务器URL)
  • 本地API URL返回预期数据
  • 使用SoapUI使用QA URL点击API(我只是在SoapUI中更改端点)
  • QA API URL返回预期数据
  • 我能够重复这4次,然后在点击QA时仍然会出现错误。再次重新启动此过程后,我现在可以让QA环境正常工作,而无需在本地使用API。知道发生了什么事吗?似乎是安装问题/代理问题/证书问题,但不知道如何调试它

    这就是我现在看到的错误: “/”应用程序中出现服务器错误。 远程主机已强制关闭现有连接 描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源。 异常详细信息:System.Net.Sockets.SocketException:远程主机强制关闭了现有连接 源错误: 在执行当前web请求期间生成了未经处理的异常。有关异常的起源和位置的信息可以使用下面的异常堆栈跟踪来识别。 堆栈跟踪:

    [SocketException (0x2746): An existing connection was forcibly closed by the remote host]
       System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult) +8156963
       System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult) +48
    
    [IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.]
       System.Net.Security._SslStream.EndRead(IAsyncResult asyncResult) +8111720
       System.Net.TlsStream.EndRead(IAsyncResult asyncResult) +275
       System.Net.Connection.ReadCallback(IAsyncResult asyncResult) +45
    
    [WebException: The underlying connection was closed: An unexpected error occurred on a receive.]
       System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) +764
       System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar) +78
    
    [HttpRequestException: An error occurred while sending the request.]
    
    [AggregateException: One or more errors occurred.]
       System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) +4451240
       Microsoft.IdentityModel.Protocols.<GetDocumentAsync>d__0.MoveNext() in c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\HttpDocumentRetriever.cs:53
    
    [IOException: Unable to get document from: https://securityeliqa.twcable.com/core/.well-known/openid-configuration]
       Microsoft.IdentityModel.Protocols.<GetDocumentAsync>d__0.MoveNext() in c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\HttpDocumentRetriever.cs:59
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +13847892
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +61
       Microsoft.IdentityModel.Protocols.<GetAsync>d__0.MoveNext() in c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\OpenIdConnectConfigurationRetriever.cs:81
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +13847892
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +61
       Microsoft.IdentityModel.Protocols.<GetConfigurationAsync>d__3.MoveNext() in c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\ConfigurationManager.cs:0
    
    [InvalidOperationException: IDX10803: Unable to create to obtain configuration from: 'https://securityeliqa.twcable.com/core/.well-known/openid-configuration'.]
       Microsoft.IdentityModel.Protocols.<GetConfigurationAsync>d__3.MoveNext() in c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\ConfigurationManager.cs:212
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +13847892
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +61
       Microsoft.IdentityModel.Protocols.<GetConfigurationAsync>d__0.MoveNext() in c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\ConfigurationManager.cs:0
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +13847892
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +61
       System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +31
       IdentityServer.WebApi.AccessTokenValidation.<<RetrieveMetadata>b__0>d__4.MoveNext() in e:\Source Code\GitHub\IdentityServer\IdentityServer.WebApi.AccessTokenValidation\Plumbing\DiscoveryDocumentIssuerSecurityTokenProvider.cs:123
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +13847892
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +61
       System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +31
       IdentityServer.WebApi.AccessTokenValidation.AsyncHelper.RunSync(Func`1 func) in e:\Source Code\GitHub\IdentityServer\IdentityServer.WebApi.AccessTokenValidation\Plumbing\AsyncHelper.cs:18
       IdentityServer.WebApi.AccessTokenValidation.DiscoveryDocumentIssuerSecurityTokenProvider.RetrieveMetadata() in e:\Source Code\GitHub\IdentityServer\IdentityServer.WebApi.AccessTokenValidation\Plumbing\DiscoveryDocumentIssuerSecurityTokenProvider.cs:141
       IdentityServer.WebApi.AccessTokenValidation.DiscoveryDocumentIssuerSecurityTokenProvider..ctor(String discoveryEndpoint, IdentityServerBearerTokenAuthenticationOptions options, ILoggerFactory loggerFactory) in e:\Source Code\GitHub\IdentityServer\IdentityServer.WebApi.AccessTokenValidation\Plumbing\DiscoveryDocumentIssuerSecurityTokenProvider.cs:43
       Owin.IdentityServerBearerTokenValidationAppBuilderExtensions.ConfigureLocalValidation(IdentityServerBearerTokenAuthenticationOptions options, ILoggerFactory loggerFactory) in e:\Source Code\GitHub\IdentityServer\IdentityServer.WebApi.AccessTokenValidation\IdentityServerBearerTokenValidationAppBuilderExtensions.cs:129
       Owin.IdentityServerBearerTokenValidationAppBuilderExtensions.UseIdentityServerBearerTokenAuthentication(IAppBuilder app, IdentityServerBearerTokenAuthenticationOptions options) in e:\Source Code\GitHub\IdentityServer\IdentityServer.WebApi.AccessTokenValidation\IdentityServerBearerTokenValidationAppBuilderExtensions.cs:39
       Company.WebApi.waAddressQualification.Startup.Configuration(IAppBuilder app) in e:\Source Code\GitHub\waDemo\Startup.cs:23
    
    [TargetInvocationException: Exception has been thrown by the target of an invocation.]
       System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0
       System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) +128
       System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +146
       Owin.Loader.<>c__DisplayClass12.<MakeDelegate>b__b(IAppBuilder builder) +93
       Owin.Loader.<>c__DisplayClass1.<LoadImplementation>b__0(IAppBuilder builder) +209
       Microsoft.Owin.Host.SystemWeb.OwinAppContext.Initialize(Action`1 startup) +843
       Microsoft.Owin.Host.SystemWeb.OwinBuilder.Build(Action`1 startup) +51
       Microsoft.Owin.Host.SystemWeb.OwinHttpModule.InitializeBlueprint() +101
       System.Threading.LazyInitializer.EnsureInitializedCore(T& target, Boolean& initialized, Object& syncLock, Func`1 valueFactory) +137
       Microsoft.Owin.Host.SystemWeb.OwinHttpModule.Init(HttpApplication context) +172
       System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +618
       System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +172
       System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +402
       System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +343
    
    [HttpException (0x80004005): Exception has been thrown by the target of an invocation.]
       System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +579
       System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +112
       System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +712
    
    Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.6.1055.0
    
    [SocketException(0x2746):远程主机强制关闭了现有连接]
    System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)+8156963
    System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)+48
    [IOException:无法从传输连接读取数据:远程主机强制关闭了现有连接。]
    System.Net.Security.\u ssstream.EndRead(IAsyncResult asyncResult)+8111720
    System.Net.TlsStream.EndRead(IAsyncResult asyncResult)+275
    System.Net.Connection.ReadCallback(IAsyncResult asyncResult)+45
    [WebException:基础连接已关闭:接收时发生意外错误。]
    System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)+764
    System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)+78
    [HttpRequestException:发送请求时出错。]
    [AggregateException:发生了一个或多个错误。]
    System.Threading.Tasks.Task`1.GetResultCore(布尔waitCompletionNotification)+4451240
    c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\HttpDocumentRetriever.cs:53中的Microsoft.IdentityModel.Protocols.d_u0.MoveNext()文件
    [IOException:无法从以下位置获取文档:https://securityeliqa.twcable.com/core/.well-known/openid-configuration]
    c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\HttpDocumentRetriever.cs:59中的Microsoft.IdentityModel.Protocols.d_0.MoveNext()文件
    System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务)+13847892
    System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+61
    c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\OpenIdConnectConfigurationRetriever.cs:81中的Microsoft.IdentityModel.Protocols.d_u0.MoveNext()文件
    System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务)+13847892
    System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+61
    c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\ConfigurationManager.cs中的Microsoft.IdentityModel.Protocols.d_3.MoveNext()文件:0
    [InvalidOperationException:IDX10803:无法创建以从以下位置获取配置:'https://securityeliqa.twcable.com/core/.well-known/openid-configuration'.]
    c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\ConfigurationManager.cs:212中的Microsoft.IdentityModel.Protocols.d_u3.MoveNext()
    System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务)+13847892
    System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+61
    c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\ConfigurationManager.cs:0中的Microsoft.IdentityModel.Protocols.d_0.MoveNext()文件
    System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务)+13847892
    System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+61
    System.Runtime.CompilerServices.TaskWaiter`1.GetResult()+31
    e:\Source Code\GitHub\IdentityServer\IdentityServer\IdentityServer.WebApi.AccessTokenValidation\Pipeoping\DiscoveryDocumentIssuerSecurityTokenProvider.cs:123中的IdentityServer.WebApi.AccessTokenValidation.d_u4.MoveNext()
    System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务)+13847892
    System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+61
    System.Runtime.CompilerServices.TaskWaiter`1.GetResult()+31
    e:\Source Code\GitHub\IdentityServer\IdentityServer.WebApi.AccessTokenValidation.asynchhelper.RunSync(Func`1 Func)中的IdentityServer.WebApi.AccessTokenValidation\pipeoping\asynchhelper.cs:18
    IdentityServer.WebApi.AccessTokenValidation.DiscoveryDocumentIssuerSecurityTokenProvider.RetrieveMetadata()位于e:\Source Code\GitHub\IdentityServer\IdentityServer.WebApi.AccessTokenValidation\Pipeoping\DiscoveryDocument中
    
    using Demo.IdentityServer.IdentityModel.Client;
    using Newtonsoft.Json;
    using PartnerPortal.Model;
    using System;
    using System.Configuration;
    using System.Diagnostics;
    using System.Net.Http;
    using System.Linq;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    namespace DemoPortal.Client
    {
        public static class DemoApiClient
        {
            public readonly static string waDemoUrl = ConfigurationManager.AppSettings["waDemoURL"];
    
            public static async Task<DemoData> GetDemoData(RequestAddress requestAddress)
            {
                try
                {
                    using (var httpClient = new HttpClient() { MaxResponseContentBufferSize = 10000000, Timeout = TimeSpan.FromMilliseconds(5000) })
                    {
                        string reasonPhrase = "";
                        var demoUri = new Uri(string.Format(waDemoUrl + "api/DemoApp/GetSomeData?trackingId={0}&clientKey={1}&address={2}", requestAddress.TrackingId, requestAddress.ClientKey, requestAddress.Address));
    
                        var httpResult = new HttpResponseMessage();
                        var result = RequestAccessToken.RequestToken().Result;
                        var accessToken = await Task.Run(() => RequestAccessToken.RequestToken().Result);
                        //var accessToken = RequestAccessToken.RequestToken().Result;
                        //which of the above two options should I use?  Does it matter?
                        httpClient.SetBearerToken(accessToken);
                        HttpResponseMessage response = await httpClient.GetAsync(demoUri);
                        HttpContent httpContent = response.Content;
                        if (httpResult.IsSuccessStatusCode)
                        {
                            var content = await httpContent.ReadAsStringAsync();
                            DemoData demoData = null;
                            demoData = JsonConvert.DeserializeObject<DemoData>(content);
                            return demoData;
                        }
                        else
                        {
                            reasonPhrase = httpResult.ReasonPhrase;
                            if (reasonPhrase.ToUpper() == "UNAUTHORIZED")
                            {
                                throw new KeyNotFoundException("Not authorized");
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("Message is:" + ex);
                    throw (ex);
                }
                return null;
            }
        }
    }
    
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Web;
    using Thinktecture.IdentityModel.Tokens.Http;
    
    namespace Demo.IdentityServer.IdentityModel.Client
    {
        public static class RequestAccessToken
        {
            public readonly static string securityUrl = ConfigurationManager.AppSettings["securityUrl"];
            public readonly static string clientSecret = ConfigurationManager.AppSettings["clientSecret"];
            public static async Task<string> RequestToken()
            {
    
                var url = new Uri(securityUrl);
    
                var fields = new Dictionary<string, string>
                {
                    { OAuth2Constants.GrantType, OAuth2Constants.GrantTypes.ClientCredentials },
                    { OAuth2Constants.Scope, "Read"}
                };
    
                using (var httpClient = new HttpClient())
                {
                    var cancellationToken = new CancellationToken();
    
                    httpClient.DefaultRequestHeaders.Authorization = new BasicAuthenticationHeaderValue("Demo", clientSecret);
    
                    var ss = JsonConvert.SerializeObject(fields);
                    var data = new FormUrlEncodedContent(fields);
                    var s = data.ReadAsStringAsync();
    
                    //var response = await httpClient.PostAsync(url, data, cancellationToken).ConfigureAwait(false);
                    var response = await httpClient.PostAsync(url, data, cancellationToken);
                    // Should I use ConfigureAwait(false) or call method with a Task(Run() ... ?
    
                    if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.BadRequest)
                    {
                        //var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
                        var content = await response.Content.ReadAsStringAsync();
    
                        var token = new TokenResponse(content);
    
                        var accessToken = token.AccessToken;
    
                        return accessToken;
                    }
                    else
                    {
                        return new TokenResponse(response.StatusCode, response.ReasonPhrase).AccessToken;
                    }
                }
            }
        }
    }