ASP.NET 5 HTML5 历史

Posted

技术标签:

【中文标题】ASP.NET 5 HTML5 历史【英文标题】:ASP.NET 5 HTML5 History 【发布时间】:2015-09-19 23:24:42 【问题描述】:

我正在将我的项目升级到 ASPNET5。我的应用程序是一个使用 html5 Url Routing (HTML5 History API) 的 AngularJS Web 应用程序。

在我之前的应用程序中,我使用了 URL 重写 IIS 模块,代码如下:

<system.webServer>
  <rewrite>
    <rules>
      <rule name="MainRule" stopProcessing="true">
        <match url=".*" />
        <conditions logicalGrouping="MatchAll">
          <add input="REQUEST_FILENAME" matchType="IsFile" negate="true" />
          <add input="REQUEST_FILENAME" matchType="IsDirectory" negate="true" />
          <add input="REQUEST_URI" matchType="Pattern" pattern="api/(.*)" negate="true" />
          <add input="REQUEST_URI" matchType="Pattern" pattern="signalr/(.*)" negate="true" />
        </conditions>
        <action type="Rewrite" url="Default.cshtml" />
      </rule>
    </rules>
  </rewrite>
<system.webServer>

我意识到我可以移植它,但我想最小化我的 Windows 依赖项。根据我的阅读,我认为我应该能够使用 ASP.NET 5 中间件来完成此操作。

我认为代码看起来像这样,但我认为我还差得很远。

app.UseFileServer(new FileServerOptions

    EnableDefaultFiles = true,
    EnableDirectoryBrowsing = true
);

app.Use(async (context, next) =>

    if (context.Request.Path.HasValue && context.Request.Path.Value.Contains("api"))
    
        await next();
    
    else
    
        var redirect = "http://" + context.Request.Host.Value;// + context.Request.Path.Value;
        context.Response.Redirect(redirect);
    
);

基本上,我想要路由包含/api/signalr 的任何内容。关于在 ASPNET5 中完成此任务的最佳方法有什么建议吗?

【问题讨论】:

是的,您可以通过middleware 实现这一目标 想展示你如何做到这一点? GitHub 上有很多 middleware 样本。我写的一个:github.com/aguacongas/chatle/tree/dev/src/ChatLe.HttpUtility 【参考方案1】:

您在正确的轨道上,但不是发回重定向,我们只想重写请求上的路径。以下代码从 ASP.NET5 RC1 开始工作。

app.UseIISPlatformHandler();

// This stuff should be routed to angular
var angularRoutes = new[] "/new", "/detail";

app.Use(async (context, next) =>

    // If the request matches one of those paths, change it.
    // This needs to happen before UseDefaultFiles.
    if (context.Request.Path.HasValue &&
        null !=
        angularRoutes.FirstOrDefault(
        (ar) => context.Request.Path.Value.StartsWith(ar, StringComparison.OrdinalIgnoreCase)))
    
        context.Request.Path = new PathString("/");
    

    await next();
);

app.UseDefaultFiles();
app.UseStaticFiles();
app.UseMvc();

这里的一个问题是您必须将您的角度路由专门编码到中间件中(或将它们放入配置文件等)。

最初,我尝试创建一个管道,其中 UseDefaultFiles() 和 UseStaticFiles() 已被调用,它会检查路径,如果路径不是/api,重写它并发送它回来了(因为应该已经处理了 /api 以外的任何东西)。但是,我永远无法让它发挥作用。

【讨论】:

为什么要在服务器端保留角度路由,这很愚蠢。所有对服务器的 API 调用都以 'api' 开头,您可以轻松地使用 .StartsWith('api',request.Path) 来确定是否设置“/”,对吧? 您当然可以反转逻辑来保存后端路由(在您的情况下,只是“api”)而不是前端路由。就我而言,前者更有意义,因为除了“api”之外,我们的前端路由和后端路由相对较少。无论哪种方式,它都等于同一件事。你重写了需要去 Angular 的路由。请记住,如果您的 ASP.NET 应用程序还负责提供文件(html、css 等),则除了“api”之外,您还需要考虑这些路径。【参考方案2】:

我正在使用:

app.UseMvc(routes =>

    routes.MapRoute(
        name:"Everything", 
        template:"*UrlInfo", 
        defaults:new controller = "Home", action = "Index");

这将导致所有路由点击主页索引页面。当我需要不在此范围内的路线时,我会在此路线之前添加它们,因为这将成为一条包罗万象的路线。

【讨论】:

【参考方案3】:

为什么不在 MVC 中使用路由功能?在 Startup.cs 的 Configure 方法中,您可以修改以下内容:

        // inside Configure method in Startup.cs
        app.UseMvc(routes =>
        
            routes.MapRoute(
                name: "default",
                template: "controller/action/id?",
                defaults: new  controller = "Home", action = "Index" );

            // Uncomment the following line to add a route for porting Web API 2 controllers.
            // routes.MapWebApiRoute("DefaultApi", "api/controller/id?");
        );  

【讨论】:

不适用于 HTML5 历史记录,您只需通过其他所有内容路由 assets/api 即可返回索引文件。

以上是关于ASP.NET 5 HTML5 历史的主要内容,如果未能解决你的问题,请参考以下文章

在asp.net中将数据绑定到html5 DataList

限制 ASP.NET 4.5 中 WebSocket 的性能因素?

带有 C# 实现的 ASP.NET HTML5 WebSockets

将 ASP.NET 文本框呈现为 HTML5 输入类型“数字”

Asp.Net MVC 和 HTML5 PUSH 通知

asp.net mvc HTML5 日期输入类型