我正在开发一个WebAssembly应用程序。我的目标是.NET 5.0,通过VS 2019年发布到一个文件夹。我的web服务器是Windows 2012 R2上的IIS 8。如果重要的话,这个应用程序只能在我们的企业内部网中访问。
应用程序的当前状态是它有默认的计数器和天气预报,尽管我已经将天气预报更改为查询SQL数据库。这种天气预报查询是通过HTTP请求完成的,如这个Youtube教程所示(下面包含了一些相关代码)。我添加了第二组用于查询的数据,也是通过HTTP请求执行的。
我的问题是,当我在VS 2019内部启动应用程序,并且SQL服务器托管在同一个开发工作站上时,我可以获取数据(并在其上执行CRUD操作)。但是,当我发布到IIS时,会遇到问题。
具体来说,如果SQL Server在我的开发工作站上,我会得到异常“响应状态代码并不表示成功: 404 (未找到)”。查看控制台的网络部分,我在http://[my IIS服务器的网络访问名称上看到了一个404 :5001/api/气象预报。当VS2019在我的开发机器上启动时,这个特定的页面会很好地加载。
我的想法之一是,这可能是Server身份验证的一个问题。当指向我的本地工作站时,它通过以下连接字符串使用Windows身份验证:
"Default": "Data Source = [my development workstation's name]; Initial Catalog = blazorTest; Integrated Security = True; MultipleActiveResultSets = True"为了测试这一点,我在虚拟服务器上设置了Server 2012 (采用混合模式身份验证),并将连接字符串更改为:
"Data Source=[virtual server's name]; Initial Catalog=blazorTest; User Id=sa; Password=[super-secure password]"现在,当我试图访问天气预报时,我得到了一个不同的错误,特别是:
"Failed to load resource: the server responded with a status of 400 ()"奇怪的是,这似乎是一个不寻常的例外,而不是像我之前看到的Console.Writeline(ex.Message)。未提及的异常引用/api/天气预报。
以下是天气预报API的代码(CART是应用程序的名称):
using CART.Server.Data_Access_Layer;
using CART.Shared;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace CART.Server.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly ILogger<WeatherForecastController> _logger;
private readonly WeatherDbContext _context;
public WeatherForecastController(ILogger<WeatherForecastController> logger, WeatherDbContext context)
{
_logger = logger;
_context = context;
}
[HttpGet]
public async Task<IActionResult> Get()
{
try
{
List<WeatherForecast> forecasts = await _context.Forecasts.ToListAsync();
return Ok(forecasts);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return BadRequest();
}
[HttpGet]
[Route("{id}")]
public async Task<IActionResult> GetById(int id)
{
try
{
WeatherForecast forecast = await _context.Forecasts.Where(f => f.Id == id).FirstOrDefaultAsync();
return Ok(forecast);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return BadRequest();
}
[HttpPost]
public async Task<IActionResult> Create([FromBody] WeatherForecast forecast)
{
try
{
_context.Forecasts.Add(forecast);
await _context.SaveChangesAsync();
return Ok(forecast);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return BadRequest();
}
[HttpPut]
[Route("{id}")]
public async Task<IActionResult> Update(int id, WeatherForecast updatedForecast)
{
try
{
_context.Forecasts.Update(updatedForecast);
await _context.SaveChangesAsync();
return Ok(updatedForecast);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return BadRequest();
}
[HttpDelete]
[Route("{id}")]
public async Task<IActionResult> Delete(int id)
{
try
{
WeatherForecast forecast = await _context.Forecasts.Where(f => f.Id == id).FirstOrDefaultAsync();
_context.Forecasts.Remove(forecast);
await _context.SaveChangesAsync();
return Ok(forecast);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return BadRequest();
}
}
}因此,在我看来,所有的尝试都没有抛出异常(在这种情况下我会看到一个Console.WriteLine(ex.message) ),但是没有达到try中的返回。相反,返回的BadRequest正在到达,这在其他代码中导致了它自己的异常。但这怎么可能呢?我想我是误会了。
同样重要的是,我需要改变/调查什么才能让它发挥作用?
ETA: --事实证明,虚拟服务器上的Server没有配置为允许远程连接。在这个链接的答案之后,我能够使数据的基本SQL获取在Visual中再次工作,在那里它与远程Server进行了对话。但是,当我发布到虚拟服务器时,我将继续获得"Response status code does not indicate success: 404 (Not Found)。此外,http://[virtual服务器名的URL ]:5001/api/风化预测得到一个404。
发布于 2021-08-18 19:39:49
事实证明,虚拟服务器上的Server未配置为允许远程连接。在这个链接的答案之后,我能够使数据的基本SQL提取再次工作。
但是,我遇到了另一个问题,即api/气象预报不会在IIS 8.5或Apache2.4(运行在虚拟服务器上不同端口上的两个web服务器)下路由。该页面将在IIS Express 10或Kestrel (可以在Visual中启动的两个web服务器)下成功路由。
因此,我决定使用Kestrel作为虚拟服务器上的web服务器。
我在服务器项目中将UseKestrel和UseUrls行添加到Program.cs中:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseKestrel();
webBuilder.UseUrls("http://localhost:5000", "http://[virtual server's network name]:5000");
webBuilder.UseStartup<Startup>();
});
}然后,我将整个解决方案复制到虚拟服务器上的C:\inetpub中。(不过,我想我可能会使用任何目录。)然后,我在虚拟服务器上安装了.NET 5.0SDK,在虚拟服务器上打开了一个命令提示符,并在C:\inetpub\Server (也就是我的dotnet run解决方案的服务器部分所在的文件夹)中运行dotnet run。
那时,我终于能够从虚拟服务器访问我的应用程序,并让它从虚拟服务器上的SQL服务器检索SQL数据!
https://stackoverflow.com/questions/68837122
复制相似问题