如何在 IIS 中设置 ASP.NET 后端?
How can I setup my ASP.NET backend in IIS?
我正在构建一个通过 Microsoft IIS 管理的网站。我希望我的整个网站像这样工作:
- IIS 通过端口 80 获取主网站的 HTTP 请求,然后使用 HTML 和 JS 文件进行响应。这些文档保持静态,只是作为文件保存在服务器上,IIS 读取这些文件并将其发送给客户端,而无需进一步修改。
- 在客户端获取的 JS 文档中,有 fetch() 命令,当用户与网站交互时,这些命令会在运行时通过不同的端口发送额外的请求。浏览器应该从服务器取回 JSON 数据。我已经编写了一个 ASP.NET 网络应用程序来执行此操作。
这是我当前在 IIS 中的设置:
enter image description here
我已经为第一步(前端)设置了一个站点,为第二步(后端)设置了一个站点。我为第一个站点添加了一个到端口 80 的绑定并设置了默认文档。我将第二个站点链接到 ASP.NET 应用程序的构建二进制文件所在的目录。然后,我将端口 5000 和相同 IP 地址的绑定添加到第二个站点。
第一步有效。通过端口 80 发送请求时,我得到了网站文件。但是第二步没有。在 Visual Studio 的调试模式下,它工作正常并且可以正常工作。但是我还没有设法让第二步在 IIS 中工作。我在发送请求时得到的响应是 404。我在后端创建了一个额外的控制器用于测试,它应该只响应一些硬编码的字符串,什么都不做。实际上这行得通。我确实得到了 200 和字符串作为响应。因此,与我的数据库通信的 ASP.NET 后端一定有问题。
我发现每次发送请求时,我的后端都会写入错误日志。它说:
失败:Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware1
执行请求时出现未处理的异常。
System.Text.Json.JsonException: 检测到不支持的可能对象循环。这可能是由于循环或对象深度大于最大允许深度 32。
在System.Text.Json.ThrowHelper.ThrowInvalidOperationException_SerializerCycleDetected(Int32 最大深度)
在System.Text.Json.JsonSerializer.Write(Utf8JsonWriter writer,Int32 originalWriterDepth,Int32 flushThreshold,JsonSerializerOptions 选项,WriteStack& state)
在 System.Text.Json.JsonSerializer.WriteAsyncCore(流 utf8Json,对象值,类型 inputType,JsonSerializerOptions 选项,CancellationToken cancellationToken)
在Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext 上下文,编码选择编码)
在Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext 上下文,编码选择编码)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|27_0(ResourceInvoker 调用程序、Task lastTask、State next、Scope 作用域、对象状态、Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|19_0(ResourceInvoker 调用程序、Task lastTask、State next、Scope 范围、对象状态、Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker 调用程序、Task 任务、IDisposable 范围)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint 端点,任务请求任务,ILogger 记录器)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.g__Awaited|6_0(ExceptionHandlerMiddleware 中间件、HttpContext 上下文、Task 任务)
同样,我在调试后端ap时没有得到错误
有人可以帮忙吗?
问题基本上是错误的SQL服务器权限设置。我设法解决了我的问题。这可能对面临类似问题的人有帮助:
- “JsonException object cycle”错误本身根本没有帮助。因此,我进行了进一步的调试。我将 VisualStudio 调试附加到实际的 运行 IIS 进程,如下所示:https://docs.microsoft.com/en-us/visualstudio/debugger/attach-to-running-processes-with-the-visual-studio-debugger?view=vs-2019
这有助于找到错误的原因,因为我现在可以体验到更适合实际错误的日志消息。请注意,您必须在 web.config 中将 hostingModel 更改为“outofprocess”才能附加到独立的 .Net 进程。 https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/out-of-process-hosting?view=aspnetcore-5.0
- 如果您使用的是 SQL Server Management Studio,请为“NT Authority”创建一个登录(对象资源管理器 > 安全 > 登录 > NT-Authority),授予对您的数据库的访问权限并确保您不要 select 用户映射中的“拒绝”角色,因为我这样做了,这导致了我的错误。
我正在构建一个通过 Microsoft IIS 管理的网站。我希望我的整个网站像这样工作:
- IIS 通过端口 80 获取主网站的 HTTP 请求,然后使用 HTML 和 JS 文件进行响应。这些文档保持静态,只是作为文件保存在服务器上,IIS 读取这些文件并将其发送给客户端,而无需进一步修改。
- 在客户端获取的 JS 文档中,有 fetch() 命令,当用户与网站交互时,这些命令会在运行时通过不同的端口发送额外的请求。浏览器应该从服务器取回 JSON 数据。我已经编写了一个 ASP.NET 网络应用程序来执行此操作。
这是我当前在 IIS 中的设置:
enter image description here
我已经为第一步(前端)设置了一个站点,为第二步(后端)设置了一个站点。我为第一个站点添加了一个到端口 80 的绑定并设置了默认文档。我将第二个站点链接到 ASP.NET 应用程序的构建二进制文件所在的目录。然后,我将端口 5000 和相同 IP 地址的绑定添加到第二个站点。
第一步有效。通过端口 80 发送请求时,我得到了网站文件。但是第二步没有。在 Visual Studio 的调试模式下,它工作正常并且可以正常工作。但是我还没有设法让第二步在 IIS 中工作。我在发送请求时得到的响应是 404。我在后端创建了一个额外的控制器用于测试,它应该只响应一些硬编码的字符串,什么都不做。实际上这行得通。我确实得到了 200 和字符串作为响应。因此,与我的数据库通信的 ASP.NET 后端一定有问题。
我发现每次发送请求时,我的后端都会写入错误日志。它说:
失败:Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware1
执行请求时出现未处理的异常。
System.Text.Json.JsonException: 检测到不支持的可能对象循环。这可能是由于循环或对象深度大于最大允许深度 32。
在System.Text.Json.ThrowHelper.ThrowInvalidOperationException_SerializerCycleDetected(Int32 最大深度)
在System.Text.Json.JsonSerializer.Write(Utf8JsonWriter writer,Int32 originalWriterDepth,Int32 flushThreshold,JsonSerializerOptions 选项,WriteStack& state)
在 System.Text.Json.JsonSerializer.WriteAsyncCore(流 utf8Json,对象值,类型 inputType,JsonSerializerOptions 选项,CancellationToken cancellationToken)
在Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext 上下文,编码选择编码)
在Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext 上下文,编码选择编码)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|27_0(ResourceInvoker 调用程序、Task lastTask、State next、Scope 作用域、对象状态、Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|19_0(ResourceInvoker 调用程序、Task lastTask、State next、Scope 范围、对象状态、Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker 调用程序、Task 任务、IDisposable 范围)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint 端点,任务请求任务,ILogger 记录器)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.g__Awaited|6_0(ExceptionHandlerMiddleware 中间件、HttpContext 上下文、Task 任务)
同样,我在调试后端ap时没有得到错误
有人可以帮忙吗?
问题基本上是错误的SQL服务器权限设置。我设法解决了我的问题。这可能对面临类似问题的人有帮助:
- “JsonException object cycle”错误本身根本没有帮助。因此,我进行了进一步的调试。我将 VisualStudio 调试附加到实际的 运行 IIS 进程,如下所示:https://docs.microsoft.com/en-us/visualstudio/debugger/attach-to-running-processes-with-the-visual-studio-debugger?view=vs-2019 这有助于找到错误的原因,因为我现在可以体验到更适合实际错误的日志消息。请注意,您必须在 web.config 中将 hostingModel 更改为“outofprocess”才能附加到独立的 .Net 进程。 https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/out-of-process-hosting?view=aspnetcore-5.0
- 如果您使用的是 SQL Server Management Studio,请为“NT Authority”创建一个登录(对象资源管理器 > 安全 > 登录 > NT-Authority),授予对您的数据库的访问权限并确保您不要 select 用户映射中的“拒绝”角色,因为我这样做了,这导致了我的错误。