如何在IIS上托管BOT Framework V4 BOT

问题描述 投票:2回答:3

我正在IIS上托管我的BOT Framework V4 BOT。服务器配置如下

  1. Windows Server 2012 R2
  2. IIS 8.5

我还安装了dotnet-hosting-2.2.1-win.exe,这对于托管BOT V4是必不可少的。我已将应用程序池设置为“无托管代码”。我已经设置了Startup.cs文件所在的文件夹的路径。另外,请找到由BOT生成的日志的附件。仍然无法正常工作,错误如下

HTTP错误403.14-禁止Web服务器配置为不列出该目录的内容。

Detailed Error Information:
Module     DirectoryListingModule
Notification       ExecuteRequestHandler
Handler    StaticFile
Error Code     0x00000000
Requested URL      https://myServer/ConfRoomBOT/
Physical Path      ProjectPath
Logon Method       Anonymous
Logon User     Anonymous
Request Tracing Directory      C:\inetpub\logs\FailedReqLogFiles

下面是web.config代码

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\ConfRoom.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" />
    </system.webServer>
  </location>
  <system.net>
     <defaultProxy useDefaultCredentials="false">
        <proxy usesystemdefault="False" proxyaddress="http://xx.xxx.xx.xxx:8080" bypassonlocal="True" />
      </defaultProxy>
  </system.net>
</configuration>

下面是BOT生成的日志

托管环境:生产内容的根路径:E:\ Project \ DotNetCoreApps \ ConfRoomPub \ WithPII \ publish现在收听开:http://127.0.0.1:41826应用程序启动。按Ctrl + C关闭下。信息:Microsoft.AspNetCore.Hosting.Internal.WebHost [1]请求启动HTTP / 1.1 GET http://example.com/ConfRoom/信息:Microsoft.AspNetCore.Hosting.Internal.WebHost [1]请求启动HTTP / 1.1 GET http://example.com/ConfRoom/信息:Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware [2]正在发送文件。请求路径:“ / default.htm”。物理路径:“ E:\ Project \ DotNetCoreApps \ ConfRoomPub \ WithPII \ publish \ wwwroot \ default.htm”信息:Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware [6]文件/default.htm未被修改的信息:Microsoft.AspNetCore.Hosting.Internal.WebHost [2]请求已完成184.4402ms 304文本/ html信息:Microsoft.AspNetCore.Hosting.Internal.WebHost [2]请求已完成188.1919ms 200 text / html信息:Microsoft.AspNetCore.Hosting.Internal.WebHost [1]请求启动HTTP / 1.1 POSThttp://example.com/ConfRoom/api/messagesapplication / json;charset = utf-8 373信息:Microsoft.AspNetCore.Hosting.Internal.WebHost [1]请求启动HTTP / 1.1 POSThttp://example.com/ConfRoom/api/messagesapplication / json;charset = utf-8 359失败:Microsoft.AspNetCore.Server.Kestrel [13]连接ID“ 0HLJNNKCOIPS7”,请求ID“ 0HLJNNKCOIPS7:00000002”:客户端引发了未处理的异常应用。 System.InvalidOperationException:IDX20803:无法执行从以下位置获取配置:'https://login.botframework.com/v1/.well-known/openidconfiguration'。---> System.IO.IOException:IDX20804:无法从以下位置检索文档:'https://login.botframework.com/v1/.well-known/openidconfiguration'。---> System.Net.Http.HttpRequestException:连接尝试失败,因为经过一段时间后被连接方未正确响应时间或建立的连接失败,因为连接的主机具有未能回应---> System.Net.Sockets.SocketException:连接尝试失败,因为经过一段时间后被连接方未正确响应时间或建立的连接失败,因为连接的主机具有未能回应System.Net.Http.ConnectHelper.ConnectAsync(字符串主机,Int32端口,CancellationToken cancellingToken)-内部异常结束堆栈跟踪---System.Net.Http.ConnectHelper.ConnectAsync(字符串主机,Int32端口,的CancellationToken cancelToken()System.Threading.Tasks.ValueTask1.get_Result() at System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken) at System.Threading.Tasks.ValueTask1.get_Result()在System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync(ValueTask1 creationTask) at System.Threading.Tasks.ValueTask1.get_Result()在System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage请求,布尔值doRequestAuth,CancelationToken cancelToken)在System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage的请求,在System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts) at Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(String address, CancellationToken cancel) --- End of inner exception stack trace --- at Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(String address, CancellationToken cancel) at Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever.GetAsync(String address, IDocumentRetriever retriever, CancellationToken cancel) at Microsoft.IdentityModel.Protocols.ConfigurationManager1.GetConfigurationAsync(CancellationToken取消)-内部异常堆栈跟踪的结尾-在Microsoft.IdentityModel.Protocols.ConfigurationManager1.GetConfigurationAsync(CancellationToken cancel) at Microsoft.IdentityModel.Protocols.ConfigurationManager1.GetConfigurationAsync()在Microsoft.Bot.Connector.Authentication.JwtTokenExtractor.ValidateTokenAsync(StringjwtToken,字符串channelId)在Microsoft.Bot.Connector.Authentication.JwtTokenExtractor.GetIdentityAsync(String方案,字符串参数,字符串channelId)Microsoft.Bot.Connector.Authentication.JwtTokenExtractor.GetIdentityAsync(StringAuthorizationHeader,字符串channelId),位于Microsoft.Bot.Connector.Authentication.ChannelValidation.AuthenticateChannelToken(字符串authHeader,ICredentialProvider凭据,HttpClient,httpClient,字符串channelId)在Microsoft.Bot.Connector.Authentication.ChannelValidation.AuthenticateChannelToken(字符串authHeader,ICredentialProvider凭据,字符串serviceUrl,HttpClient httpClient,字符串channelId)Microsoft.Bot.Connector.Authentication.JwtTokenValidation.ValidateAuthHeader(StringauthHeader,ICredentialProvider凭据,IChannelProviderchannelProvider,字符串channelId,字符串serviceUrl,HttpClienthttpClient)Microsoft.Bot.Connector.Authentication.JwtTokenValidation.AuthenticateRequest(IActivity活动,字符串authHeader,ICredentialProvider凭据,IChannelProvider提供程序,HttpClient httpClient),网址为Microsoft.Bot.Builder.BotFrameworkAdapter.ProcessActivityAsync(StringauthHeader,Activity活动,BotCallbackHandler回调,的CancellationToken cancelToken()Microsoft.Bot.Builder.Integration.AspNet.Core.Handlers.BotMessageHandler.ProcessMessageRequestAsync(HttpRequest请求,IAdapterIntegration适配器,BotCallbackHandlerbotCallbackHandler,CancelationToken cancelToken),位于Microsoft.Bot.Builder.Integration.AspNet.Core.Handlers.BotMessageHandlerBase.HandleAsync(HttpContexthttpContext)Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext上下文)Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.Invoke(HttpContexthttpContext)Microsoft.AspNetCore.Builder.Extensions.UsePathBaseMiddleware.Invoke(HttpContext上下文)Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests [TContext](IHttpApplication1 application) fail: Microsoft.AspNetCore.Server.Kestrel[13] Connection id "0HLJNNKCOIPS6", Request id "0HLJNNKCOIPS6:00000002": An unhandled exception was thrown by the application. System.InvalidOperationException: IDX20803: Unable to obtain configuration from: 'https://login.botframework.com/v1/.well-known/openidconfiguration'. at Microsoft.IdentityModel.Protocols.ConfigurationManager1.GetConfigurationAsync(CancellationToken取消)Microsoft.IdentityModel.Protocols.ConfigurationManager1.GetConfigurationAsync() at Microsoft.Bot.Connector.Authentication.JwtTokenExtractor.ValidateTokenAsync(String jwtToken, String channelId) at Microsoft.Bot.Connector.Authentication.JwtTokenExtractor.GetIdentityAsync(String scheme, String parameter, String channelId) at Microsoft.Bot.Connector.Authentication.JwtTokenExtractor.GetIdentityAsync(String authorizationHeader, String channelId) at Microsoft.Bot.Connector.Authentication.ChannelValidation.AuthenticateChannelToken(String authHeader, ICredentialProvider credentials, HttpClient httpClient, String channelId) at Microsoft.Bot.Connector.Authentication.ChannelValidation.AuthenticateChannelToken(String authHeader, ICredentialProvider credentials, String serviceUrl, HttpClient httpClient, String channelId) at Microsoft.Bot.Connector.Authentication.JwtTokenValidation.ValidateAuthHeader(String authHeader, ICredentialProvider credentials, IChannelProvider channelProvider, String channelId, String serviceUrl, HttpClient httpClient) at Microsoft.Bot.Connector.Authentication.JwtTokenValidation.AuthenticateRequest(IActivity activity, String authHeader, ICredentialProvider credentials, IChannelProvider provider, HttpClient httpClient) at Microsoft.Bot.Builder.BotFrameworkAdapter.ProcessActivityAsync(String authHeader, Activity activity, BotCallbackHandler callback, CancellationToken cancellationToken) at Microsoft.Bot.Builder.Integration.AspNet.Core.Handlers.BotMessageHandler.ProcessMessageRequestAsync(HttpRequest request, IAdapterIntegration adapter, BotCallbackHandler botCallbackHandler, CancellationToken cancellationToken) at Microsoft.Bot.Builder.Integration.AspNet.Core.Handlers.BotMessageHandlerBase.HandleAsync(HttpContext httpContext) at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.Invoke(HttpContext httpContext) at Microsoft.AspNetCore.Builder.Extensions.UsePathBaseMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication1应用程序)信息:Microsoft.AspNetCore.Hosting.Internal.WebHost [2]请求完成于21679.9889ms 500信息:Microsoft.AspNetCore.Hosting.Internal.WebHost [2]请求完成于14958.2414ms 500信息:Microsoft.AspNetCore.Hosting.Internal.WebHost [1]请求启动HTTP / 1.1 POSThttp://127.0.0.1:41826/CONFROOM/iisintegration0信息:Microsoft.AspNetCore.Hosting.Internal.WebHost [2]请求已在0.373毫秒内完成202应用程序正在关闭...

请帮助。谢谢。

azure iis botframework bots azure-bot-service
3个回答
0
投票
如果要在IIS中托管.net核心应用程序,则IIS仍将在应用程序目录中需要一个web.config,这将至少具有处理程序映射和aspNetCore路径。

基本上,IIS必须知道该应用程序是.net核心应用程序以及要运行的代码。

我可能是错的,但是看起来它像对待静态文件一样对待一切。

I get this error if I remove the web.config from a working .net core app hosted in IIS.

看起来与您的错误几乎相同,而我犯了类似的错误。

通常,我很幸运地将我的项目发布为IIS Web部署程序包。这往往会创建所有必要的位。

正在运行的web.confg可能看起来像这样。

<configuration> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\blagh.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" /> </system.webServer> </configuration>


0
投票

应用程序引发了未处理的异常。 System.InvalidOperationException:IDX20803:无法从“ https://login.botframework.com/v1/.well-known/openidconfiguration”获取配置。 ---> System.IO.IOException:IDX20804:无法从“ https://login.botframework.com/v1/.well-known/openidconfiguration”检索文档。 ---> System.Net.Http.HttpRequestException:

连接尝试失败,因为在一段时间后被连接方未正确响应,或者由于连接的主机未能响应而建立的连接失败

现在,如果您只是使用浏览器导航到该地址,您应该会看到没有响应,该响应包含描述OpenID配置的JSON元数据文档,这没问题:

{ "issuer": "https://api.botframework.com", "authorization_endpoint": "https://invalid.botframework.com", "jwks_uri": "https://login.botframework.com/v1/.well-known/keys", "id_token_signing_alg_values_supported": [ "RS256" ], "token_endpoint_auth_methods_supported": [ "private_key_jwt" ] }

好消息是您的机器人似乎运行良好。这实际上表明该机器人已经运行并且已经足够远,可以对请求进行身份验证,所以这是一个好兆头。在我看来,这种异常气味是,无论您的漫游器托管在哪里,都可能没有能力向互联网发出出站请求。那可能吗?它需要能够验证来自bot框架的JWT令牌的真实性,并最终需要通过bot框架将响应发送回客户端。您可能需要将对botframework.com域的HTTP请求列入白名单。


0
投票

应用程序池标识

    IIS对托管应用程序的身份验证和授权(连接为)。
  • [删除了我为身份验证编写的所有代码,例如OAuth等。
  • 谢谢您的时间。
  • © www.soinside.com 2019 - 2024. All rights reserved.