Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Asp.net core 在Blazor WebAssembly解决方案中,如何在服务器API的不同端口上托管Blazor WASM客户端应用程序_Asp.net Core_Blazor_Iis Express_Blazor Client Side_Asp.net Core Staticfile - Fatal编程技术网

Asp.net core 在Blazor WebAssembly解决方案中,如何在服务器API的不同端口上托管Blazor WASM客户端应用程序

Asp.net core 在Blazor WebAssembly解决方案中,如何在服务器API的不同端口上托管Blazor WASM客户端应用程序,asp.net-core,blazor,iis-express,blazor-client-side,asp.net-core-staticfile,Asp.net Core,Blazor,Iis Express,Blazor Client Side,Asp.net Core Staticfile,我有一个Blazor WebAssembly解决方案,其中包含一个客户端项目、服务器项目和共享项目,基于Microsoft的默认解决方案模板。我正在使用Google Chrome在Visual Studio 2019预览版中进行编辑和调试 开箱即用的解决方案只有一个启动项目,即服务器应用程序。该服务器应用程序具有对客户端应用程序的项目引用。您可以通过检查服务器项目属性中的“启用SSL”将其设置为使用HTTPS,我已经这样做了 当您单击debug时,它工作得非常好 现在我想更改它,以便所有Blaz

我有一个Blazor WebAssembly解决方案,其中包含一个客户端项目、服务器项目和共享项目,基于Microsoft的默认解决方案模板。我正在使用Google Chrome在Visual Studio 2019预览版中进行编辑和调试

开箱即用的解决方案只有一个启动项目,即服务器应用程序。该服务器应用程序具有对客户端应用程序的项目引用。您可以通过检查服务器项目属性中的“启用SSL”将其设置为使用HTTPS,我已经这样做了

当您单击debug时,它工作得非常好

现在我想更改它,以便所有Blazor WASM页面都可以从中获得服务,服务器应用程序的API控制器端点也可以从中获得服务

我想使用URL的这个额外的“/api”部分来保持对api的请求与仅仅在Blazor客户端应用程序中导航是分开的。因此,如果我请求“”,我知道我将在我的web API中找到一个点,但是如果我请求“”,我知道我将在Blazor客户端应用程序中找到一个特定的页面。我认为它也将更接近正常的生产设置

我希望我想做的事情很清楚

显然,开始的地方似乎是将服务器应用程序属性的“调试”部分中的“应用程序URL”设置更改为“”。项目分配的安全URL为“”。我在客户端应用程序中保留了相同的设置,因此在客户端应用程序中,客户端应用程序属性的“调试”部分中的“应用程序URL”设置仍然为“”,项目将安全URL分配为“”

那会破坏一切

现在“将我带到404 Not Found错误”和“将我带到显示以下内容的页面:

正在加载…

发生了未处理的错误。从Wasm/托管模板重新加载对新应用程序的最小更改:

WeatherForecastController.cs

FetchData.razor

//forecast=wait Http.GetJsonAsync(“WeatherForecast”);
预测=等待Http.GetJsonAsync(“api/WeatherForecast”);

好的!我终于想出了一个可行的办法。这并不复杂,但我花了好几天才找到答案,所以我将把它贴在这里,因为我认为它对其他人有用

在控制器上:

[Route("api/[controller]")]
public class SampleController : ControllerBase
    {
    //Etc.
    }
在Startup.cs中

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            //Etc.
            app.UseStaticFiles();
            app.UseRouting();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
                endpoints.MapControllers();
                endpoints.Map("api/{**slug}", HandleApiFallback);
                endpoints.MapFallbackToFile("{**slug}", "index.html");
            });
        }

        private Task HandleApiFallback(HttpContext context)
        {
            context.Response.StatusCode = StatusCodes.Status404NotFound;
            return Task. CompletedTask;
        }

你的版本是什么?此模型最近有一些更改。我使用的是Microsoft Visual Studio Community 2019预览版16.6.0预览版2.1。WASM应用程序以netstandard2.1和RazorLang 3.0为目标。web API以netcoreapp3.1为目标。两个都是C#8.0版本。感谢您的快速响应,Henk!当应用程序以这种方式设置时,Blazor应用程序仍然会截获对的请求,并显示一个页面,上面写着“此地址没有任何内容”。如果可能的话,我希望像这样的请求从web api传递原始JSON,或者是一个错误,而不是Blazor WASM应用程序上的页面,因为我只希望在URL没有“/api”路径时才涉及客户端应用程序。你明白我的意思吗?嗨,亨克·霍特曼!我希望你身体好。我想知道您是否有机会了解这一点,是否知道如何配置控制器回退,以便“/api”路由不会路由到Blazor客户端应用程序?谢谢您,Henk!对于ASP NET核心人员,下面是我第一次尝试解决方案。这似乎完成了工作,但我很高兴知道这是否是标准和正确的方法:
[Route("api/[controller]")]
public class SampleController : ControllerBase
    {
    //Etc.
    }
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            //Etc.
            app.UseStaticFiles();
            app.UseRouting();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
                endpoints.MapControllers();
                endpoints.Map("api/{**slug}", HandleApiFallback);
                endpoints.MapFallbackToFile("{**slug}", "index.html");
            });
        }

        private Task HandleApiFallback(HttpContext context)
        {
            context.Response.StatusCode = StatusCodes.Status404NotFound;
            return Task. CompletedTask;
        }