簡體   English   中英

ASP NET Core服務特定的html頁面

[英]ASP NET Core Serving specific html page

我有這個中間件:

public class SpecificPageMiddleware
{
    private readonly RequestDelegate next;

    public SpecificPageMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        if (this.IsSubDomainRequest(context.Request.Host.Value)) 
        {
            if (this.IsIndexRequest(context.Request.Path.Value)) 
            {
                await this.ReturnIndexPage(context);
                return;
            }
        }

        await this.next.Invoke(context);
    }

    private bool IsSubDomainRequest(string host)
    {
        return host.StartsWith("subdomain")
                || host.Contains("subdomain");
    }

    private bool IsIndexRequest(string query)
    {
        return query == "/" || query == "/response.html";
    }

    private static async Task ReturnIndexPage(HttpContext context)
    {
        var file = new FileInfo(@"wwwroot\response.html");
        byte[] buffer;
        if (file.Exists)
        {
            context.Response.StatusCode = (int)HttpStatusCode.OK;
            context.Response.ContentType = "text/html";

            buffer = File.ReadAllBytes(file.FullName);
        }
        else
        {
            context.Response.StatusCode = (int)HttpStatusCode.NotFound;
            context.Response.ContentType = "text/plain";

            buffer = Encoding.UTF8.GetBytes("Unable to find the requested file");
        }

        using (var stream = context.Response.Body)
        {
            await stream.WriteAsync(buffer, 0, buffer.Length);
            await stream.FlushAsync();
        }

        context.Response.ContentLength = buffer.Length;
    }
}

很簡單,當我得到這樣的東西時: subdomain.mydomain.com我想顯示一個特定的html頁面,否則繼續正常的中間件管道到www.mydomain.com

當這個中間件被擊中時,它最終在瀏覽器中成為404。 如果我沒有設置內容類型,那么它最終為200,所有html都寫為文本,而不是呈現為html。 我在這里錯過了什么?

我不想使用app.UseDefaultFiles()app.UseStaticFiles()

回答。

你犯的一個錯誤是:

await this.ReturnIndexPage(context);                      // wrong!
await SpecificPageMiddleware.ReturnIndexPage(context);    // right (1)
await ReturnIndexPage(context);                           // right (2)

this意味着實例。 您無法從實例訪問static方法。 相反,你必須使用類型名稱(1)或沒有資格(2)來限定它,你沒事。

適用於我的機器

為了更好的衡量, 這也是GitHub的演示。

SimpleMiddleware.cs

using Microsoft.AspNet.Builder;
using System.Threading.Tasks;
using Microsoft.AspNet.Http;
using System.IO;
using System.Text;
using System.Net;

namespace App04SimpleMiddleware
{
    public class SimpleMiddleware
    {
        private readonly RequestDelegate _next;
        public SimpleMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            if (context.Request.QueryString.ToString().Contains("simple"))
            {
                await ReturnIndexPage(context);          // right! 
                return;
            }
            await _next.Invoke(context);
        }

        private static async Task ReturnIndexPage(HttpContext context)
        {
            var file = new FileInfo(@"wwwroot\response.html");
            byte[] buffer;
            if (file.Exists)
            {
                context.Response.StatusCode = (int)HttpStatusCode.OK;
                context.Response.ContentType = "text/html";

                buffer = File.ReadAllBytes(file.FullName);
            }
            else
            {
                context.Response.StatusCode = (int)HttpStatusCode.NotFound;
                context.Response.ContentType = "text/plain";
                buffer = Encoding.UTF8
                    .GetBytes("Unable to find the requested file");
            }

            context.Response.ContentLength = buffer.Length;

            using (var stream = context.Response.Body)
            {
                await stream.WriteAsync(buffer, 0, buffer.Length);
                await stream.FlushAsync();
            }    
        }
    }
}

Startup.cs

using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;

namespace App04SimpleMiddleware
{
    public class Startup
    {   
        public void Configure(IApplicationBuilder app)
        {
            app.UseMiddleware<SimpleMiddleware>();            
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello world!");
            });
        }
    }
}

結果

簡單查詢字符串

沒有查詢字符串

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM