GVKun编程网logo

什么是带有 MVC Angular 和 Kendo 的 ASP.NET Web 应用程序?(mvc有什么作用)

1

在本文中,我们将给您介绍关于什么是带有MVCAngular和Kendo的ASP.NETWeb应用程序?的详细内容,并且为您解答mvc有什么作用的相关问题,此外,我们还将为您提供关于ASP.netCor

在本文中,我们将给您介绍关于什么是带有 MVC Angular 和 Kendo 的 ASP.NET Web 应用程序?的详细内容,并且为您解答mvc有什么作用的相关问题,此外,我们还将为您提供关于ASP.net Core 3.1 Web 应用程序在 IFrame 中调用另一个 ASP.NET Core 应用程序 url 会重置身份,任何其他页面都重定向到登录页面、ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门、ASP.NET Core 或 ASP.NET Core MVC 解决方案无法运行,IIS Express 抛出 HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动、ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?的知识。

本文目录一览:

什么是带有 MVC Angular 和 Kendo 的 ASP.NET Web 应用程序?(mvc有什么作用)

什么是带有 MVC Angular 和 Kendo 的 ASP.NET Web 应用程序?(mvc有什么作用)

如何解决什么是带有 MVC Angular 和 Kendo 的 ASP.NET Web 应用程序?

我现在的工作是开发一个旧的 ASP.NET Web 应用程序,该应用程序以前是由美国以外的公司购买和构建的。

我们公司有几个客户使用这个网站来购买他们公司的产品。

几年前,我的公司决定开始在本地而不是在海外开展这项工作,几个月前我被聘用以帮助赶上客户报告的几个错误。

自从我在这里工作以来,我发现解决方案的主要部分是一个带有 Master.PageASP.NET Web 应用程序 /strong>。

然而,有些页面遵循 MVC 结构,但 MVC 中的一些模型只是返回 .aspx 页面并且没有视图或控制器。

还有其他页面是使用带有 Kendo 插件的 Angular 创建的。这些的大部分代码都位于一个专用文件夹中,并且都是独立显示的 javascript 或使用 ASP.NET 页面或 MVC 结构。

我正在努力加快 MVC 和 Angular 的发展速度,但是这个项目并没有遵循我在学习教程时发现的结构。

很多 Angular 都显示在 iframe 中,因此它不会出现在浏览器的 URL 中,并且很难找到其源代码。

这是否为任何人敲响了警钟?这是我可以在线研究以了解其流程的已知类型的项目吗?

当我尝试在 Visual Studio 2019 中创建一个新项目时,有许多我没有经验的项目类型(ASP.NET Core Web 应用、Blazor 应用、gRPC 服务等)。

遗憾的是,我不能只看“项目属性”页面就知道它是哪种类型的解决方案。

我如何知道这个项目叫什么?希望这对我的发展有所帮助。

ASP.net Core 3.1 Web 应用程序在 IFrame 中调用另一个 ASP.NET Core 应用程序 url 会重置身份,任何其他页面都重定向到登录页面

ASP.net Core 3.1 Web 应用程序在 IFrame 中调用另一个 ASP.NET Core 应用程序 url 会重置身份,任何其他页面都重定向到登录页面

如何解决ASP.net Core 3.1 Web 应用程序在 IFrame 中调用另一个 ASP.NET Core 应用程序 url 会重置身份,任何其他页面都重定向到登录页面

我正在使用 ASP.net core 3.1 创建 2 个 Web 应用程序。 我需要在第二个应用程序中调用 iFrame 中的第一个应用程序,它会重置登录身份,当我单击网站中的任何其他链接时,它会重定向到登录页面。如何避免这种情况?

在我用来加载 iFrame 的 jQuery 代码下方。

$(document).ready(function () {

$(function() {

    $(''#previewBot'').on(''click'',function () {

        var client = $("#client_id_broker").html();  
        var secret =   $("#session_secret").html();  
        var siteid = $("#site_id_broker").html();  
        var site = window.location.hostname;

        var chatpopContent = "<iframe src=''";
        var number = 1 + Math.floor(Math.random() * 6);
        var URIChat = "https://localhost:44355/?client=" + client + "&siteid=" + siteid + "&secret=" + secret + "&site=" + site + "&r=" + number ;
        chatpopContent += URIChat;

        chatpopContent += "'' id=''iView'' frameborder=''1''frame-container'' referrerpolicy=''no-referrer'' rel=''noreferrer'' async=''false'' ></iframe>";


        $("#showpreview").empty();
        $("#iView").remove();
        $("#showpreview").append(chatpopContent);

    });
});

});

下面是我的启动配置,有什么问题吗?或者应该添加什么以避免在调用 iframe 后重定向到登录页面?

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UsesqlServer(Configuration.GetConnectionString("sqlConStringLocal")));

        services.AddDefaultIdentity<ApplicationUser>(options =>
        {
            options.SignIn.RequireConfirmedAccount = true;
            options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstffgsfsdfsfsfff123456789-_";
            options.User.RequireUniqueEmail = true;
        }).AddEntityFrameworkStores<ApplicationDbContext>();

        services.ConfigureApplicationCookie(o => {
            o.ExpireTimeSpan = TimeSpan.FromDays(5);
            o.SlidingExpiration = true;

        });
        services.AddMvc(o =>
        {
            //Add Authentication to all Controllers by default.
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            o.Filters.Add(new Authorizefilter(policy));
        }).AddNToastNotifyNoty(new NotyOptions
        {
            Layout = "bottomright",ProgressBar = true,Timeout = 5000,Theme = "metroui"
        });

        services.Configure<DataProtectionTokenProviderOptions>(o =>
         o.TokenLifespan = TimeSpan.FromHours(3));
        
        services.AddAutoMapper(typeof(Startup));
        services.AddRazorPages();
        services.AddControllers();
        services.AddSignalR();
        services.AddTransient<IEmailSender,EmailSender>();
        services.Configure<AuthMessageSenderOptions>(Configuration);
         //services.AddSingleton<IRepository,Repository>();
     
        services.AddScoped<ISitesRepository,SitesRepository>();
        services.AddCors();
        services.AddControllersWithViews()
           .AddNewtonsoftJson()
           .AddXmlDataContractSerializerFormatters();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app,IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");

            app.UseHsts();
        }

        app.UseCors(builder =>
        {
            builder
            .AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader();
        });

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseNToastNotify();
        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
        });



        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
            endpoints.MapControllers();
            endpoints.MapHub<ChatAdminHub>("/chatAdminHub");
        });
    }

解决方法

通过添加以下 cookiePolicyOptions,我设法解决了这个问题。

       services.Configure<CookiePolicyOptions>(options =>
        {
            
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
            options.OnAppendCookie = cookieContext =>
              CheckSameSite(cookieContext.Context,cookieContext.CookieOptions);
            options.OnDeleteCookie = cookieContext =>
              CheckSameSite(cookieContext.Context,cookieContext.CookieOptions);
        });
        services.ConfigureApplicationCookie(options =>
        {
            options.Cookie.Name = "myappcookieName";
            options.Cookie.SameSite = SameSiteMode.None;
            
        });

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门

默认的身份认证好授权系统



UserManager用来操作用户的类,

Singi用来身份认证的

添加AccountController

先声明SignInManager和UserManager这两个服务

快捷键Ctrl+.

两个都需要分别进行Ctrl+.快速的生成

创建登陆的Action Login

建立View

创建LoginViewModel

主要是用户名和密码两个字段



登陆的逻辑

注册的逻辑



退出的逻辑

创建regiser的视图页面

在_Lauout里面添加了注册和登陆的链接


点击注册发现报错了。没有注册服务

注册服务

这里按照官方文档来就可以了

这里么有ApplicationDbContext


这里修改为IdentityContext

先进行数据迁移

报错,项目里面多余一个DbContext。一个是自己的DbConext 一个是Identity的DbContext

所以需要指定具体的DbContect


注册服务的时候,指明迁移的类库名称

再次尝试成功





上面只是配置了DbConext,还需要注册IdentityUser的服务


前面多加了一个叹号

密码严格要求了

参考官方文档:把这块复制过去进行修改



判断用户登陆成功后就不再显示,注册和登陆的按钮,在View页面注册ItentityUser





运行页面并不好用,没有使用中间件

登陆成功后

授权

添加一个学生,要求只有登陆的用户才可以进去添加
授权使用Authorize这个属性,这样就只有登陆的用户才可以访问这个Create页面

这个标签可以作用于Controller也可以作用于action,这里我们先作用于Create的两个Action就可以了

Authorize属性也可以加一些参数。。。、这里展示先不加
测试页面。

需要一个LoginPartial页面,一旦没有权限就会跳转到这个页面。这里我们先不做,

 

ASP.NET Core 或 ASP.NET Core MVC 解决方案无法运行,IIS Express 抛出 HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动

ASP.NET Core 或 ASP.NET Core MVC 解决方案无法运行,IIS Express 抛出 HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动

如何解决ASP.NET Core 或 ASP.NET Core MVC 解决方案无法运行,IIS Express 抛出 HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动

即使在 Visual Studio 中最简单的“Hello world”ASP.NET Core Web 应用程序上,我也遇到过此错误。 (Win 10 Pro、IIS Express、VS 2019 CE。)重现步骤:

  1. 在 Visual Studio 2019 中创建新的 ASP.NET Core 或 ASP.NET Core MVC 解决方案。选择选项以生成基本“hello world”应用程序的脚手架代码。无论您的目标是 .NET Core 2.1、.NET Core 3.1 还是 .NET 5.0,在我尝试的场景中结果都是一样的。

  2. 项目和解决方案已加载,源代码可见且看起来正确。按F5运行它。应用编译但不运行。

预期行为:“hello world”应用加载。

实际行为:在网络浏览器中显示此错误消息:

“HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动”(以及一些 故障排除步骤,然后)“有关更多信息,请访问: https://go.microsoft.com/fwlink/?LinkID=2028265”。

  1. 继续并点击该链接,然后使用这些资源仔细检查您是否拥有所有需要的包并且您的 IIS 配置正确。我的机器在我的机器上看起来很好,但我仍然收到这个错误。我什至尝试重新安装 VS、托管包、IIS 等,但无济于事。

注意:此问题与“500.32 ANCM Failed To 加载 DLL”或“500.36 ANCM 进程外处理程序加载失败” 错误,但我在故障排除过程中也遇到了这些错误,所以我 在这里提及它们,以防对其他人有帮助。

另请注意:您不一定有损坏的 ASP.NET Core 模块为 this documentation 会让您相信。

  1. 检查事件日志,您会发现其中存在一些错误,但在这种情况下,这些错误对诊断问题没有特别帮助。就我而言,它只是说

"应用程序 ''/LM/W3SVC/2/ROOT'' 具有物理根目录 ''H:\\Repo (R;)\\sandBox\\AspNetCoreWebApp001\\AspNetCoreWebApp001''加载失败 核心资源异常消息:CLR 工作线程提前退出"

"应用程序已从 Program.Main 退出,退出代码 = ''-2147450743''。请检查 stderr 日志以获取更多信息。"

他们将 IIS Express AspNetCore 模块显示为源。供应商文档在这种情况下并没有太大帮助。

  1. 仔细检查以确保 IIS 配置正确,并且安装了正确的包,包括 .NET Core 托管包。如果您不这样做,或者您正在尝试不同的配置,就像我在故障排除期间一样,那么您可能会看到上面提到的 ANCM 错误。如果您遇到这些错误,这里有 two links 可以提供帮助。我阅读了这些链接并多次仔细检查了我的机器。就我而言,这一切都是正确和完整的,但我仍然有错误。

  2. 再和电脑打几下,叫它一些坏名字,第三次重新安装Visual Studio,第八次验证IIS设置,向你的朋友寻求帮助,再次检查SO和Google。简单的 hello world 应用程序仍然无法运行,同样的错误。它在另一台机器上运行,所以代码本身没有任何问题。

解决方法

这是最终在我的机器上修复它的解决方案:我将解决方案移到了不同​​的文件夹。 HUH???如何我问,这能不能解决这个问题。经过一番折腾,我终于找到了根本原因:路径中有一个分号。是的。就我而言,我一直将解决方案存储在名为“H:\\Repo (R;)”的目录中。事实证明,即使 Windows 操作系统允许使用 ; 字符,.NET CLR 根本不喜欢它,也不知道如何处理它。因此它会生成无用的错误消息。

试试看。重命名“这应该可以工作”解决方案的文件夹以删除分号,关闭并重新打开 VS 中的解决方案,按 F5 并观察它运行。或者转到工作解决方案并将文件夹重命名为包含分号,然后观察它是否会破坏 CLR。​​

我很好奇文件夹名称中的任何其他特殊字符是否会导致问题,所以我检查了所有这些字符(在文件夹上,而不是文件名上,但我希望文件名也有类似的结果)。这是我的详尽测试:

Windows 不允许在文件夹名称中使用这些:

\\/:*?"<>|

当路径包含以下任何特殊字符时,解决方案将加载并运行:

`~-_+='',.()[]{}!@#$%&

但是,在 Windows 允许的路径中包含这些字符中的任何一个都会导致 CLR 或 Visual Studio 中的问题:

; 导致“HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动”

^ VS 无法加载解决方案并显示如下错误消息:

"在命令行中指定了以下文件:<.sln> 找不到这些文件,也不会加载这些文件。” 而是加载了一个完全空的 VS 实例。

我还尝试在 VS 中在名称中包含分号的文件夹下创建一个新的“hello world”控制台应用程序,你猜怎么着?这也无法运行。虽然在这种情况下,显然 IIS 没有 HTTP 错误。相反,它说

“未能创建 CoreCLR,HRESULT:0x80070057”

并抛出进程退出代码。再一次,这是路径中有分号的结果,因为从路径中删除该分号并在 VS 中重新加载解决方案可以使其正确运行。所以分号问题似乎源于CLR,因此与IIS无关。

以下是一些有关根本原因的相关帖子,这对于在 IIS Express 上运行的 Web 应用程序并不明显:

Failed to create CoreCLR,HRESULT: 0x80070057

https://github.com/dotnet/sdk/issues/13954

因此,感谢那些对 RCA 非常有帮助的帖子的作者。

有人会认为操作系统允许的特殊字符也可以用于 Visual Studio 代码的路径中。那好吧。吸取的教训。

ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?

ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?

 

ASP.NET MVC 的路由实际上是建立在 ASP.NET 的路由系统之上的.

MVC 路由注册通常是这样的:

RouteTable 是一个全局路由表, 它的 Routes 静态属性是一个 RouteCollection 类型的实例,而 RouteCollection 是一个继承自 Collection<RouteBase> 的子类, RouteBase 是 ASP.NET 路由系统定义的基类

.

RouteBase 有一个唯一的实现类:

当我们通过如下方法注册一个路由时:

 

实际是向全局路由表中添加了一个 Route 类型的实例,部分源码如下: 

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)
    {
      ......
      Route route = new Route(url, (IRouteHandler) new MvcRouteHandler())
      {
    ......
      };
    ......
      routes.Add(name, (RouteBase) route);
      return route; }

从源码中我们可以看到,添加 Route 对象的时候,直接传入了一个 MvcRouteHandler 类型的实例.

我们知道, ASP.NET 的路由系统对路由的解析是通过一个注册的 HttpModule 对象实现对请求的拦截,然后为当前 Http 上下文动态映射一个 HttpHandler 对象, 而这个  HttpHandler 对象会接管对当前请求的处理并最终对请求予以响应.

这个注册的 HttpModule 对象的类型叫做 UrlRoutingModule .

我们可以在ASP.NET 的全局系统配置文件中找到它:

     <httpModules>
        ......
            <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule"/>
           ......
        </httpModules>

该类型在 PostResolveRequestCache 事件实现对请求的拦截:

 在拦截时,它做了这么几件事(部分源码省略):

public virtual void PostResolveRequestCache(HttpContextBase context)
    {
      RouteData routeData = this.RouteCollection.GetRouteData(context);     
      IRouteHandler routeHandler = routeData.RouteHandler; IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);  context.RemapHandler(httpHandler); }

1.遍历所有注册的路由,也就是所有添加到全局路由表中的 Route 类型的实例,通过调用它们的 GetRouteData 方法,拿到第一个匹配的 RouteData (路由数据);

2.拿到路由数据中的 RouteHandler 对象, 其实就是 MvcRouteHandler 类型的实例;

3.调用 MvcRouteHandler 的 GetHttpHandler 方法,拿到 HttpHandler.

MvcRouteHandler 的 GetHttpHandler 方法源码如下:

protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
      requestContext.HttpContext.SetSessionStateBehavior(this.GetSessionStateBehavior(requestContext));
      return (IHttpHandler) new MvcHandler(requestContext);
    }

可以看到,直接 new 了一个 MvcHandler 类型的实例,

最终,请求转交给这个 MvcHandler 类型的实例处理.

 

ASP.NET Web API 是怎么与 ASP.NET 路由系统接轨的呢?

我们知道, ASP.NET 的路由系统对路由的解析是通过一个注册的 HttpModule 对象实现对请求的拦截,然后为当前 Http 上下文动态映射一个 HttpHandler 对象, 而这个  HttpHandler 对象会接管对当前请求的处理并最终对请求予以响应.

这一条不仅对 MVC 适用, 对 Web API 同样适用,因为他俩都是借助于 ASP.NET 的路由系统.

区别在于 HttpHandler 的类型不一样而已.

ASP.NET Web API 注册路由的代码通常是这样的:

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new
                {
                    id = RouteParameter.Optional } );

config.Routes 是一个 HttpRouteCollection 类型的实例,并且是只读的.

只读的,就意味着只能在该实例所属的类的构造函数中初始化.

我们知道,这个 config 是 HttpConfiguration 类型,它在 GlobalConfiguration 类中初始化.

在它的初始化代码中,我们可以看到:

private static Lazy<HttpConfiguration> CreateConfiguration()
        {
            return new Lazy<HttpConfiguration>(() =>
            {
                HttpConfiguration config = new HttpConfiguration(new HostedHttpRouteCollection(RouteTable.Routes));
          ......return config;
            });
        }

 

HttpConfiguration 实际是对 HostedHttpRouteCollection 的封装,而后者是对 RouteTable.Route 的封装. 即 ASP.NET 全局路由表的封装.

所以说, HttpConfiguration 类型封装了 ASP.NET 的全局路由表. 它的 Routes 属性的实际类型是  HostedHttpRouteCollection

我们再回头看 config.Routes.MapHttpRoute 方法 , 也就是 HostedHttpRouteCollection 类型的 MapHttpRoute 方法:

public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler)
        {
            ......
            IHttpRoute route = routes.CreateRoute(routeTemplate, defaultsDictionary, constraintsDictionary, dataTokens: null, handler: handler);
            routes.Add(name, route);
            return route;
        }

很简单,创建了一个路由,然后添加它.

我们继续查看 HostedHttpRouteCollection 类型的 CreateRoute 方法:

public override IHttpRoute CreateRoute(string uriTemplate, IDictionary<string, object> defaults, IDictionary<string, object> constraints, IDictionary<string, object> dataTokens, HttpMessageHandler handler)
    {
    ......
    return (IHttpRoute) new HostedHttpRoute(uriTemplate, defaults, constraints, dataTokens, handler); }

返回了一个 HostedHttpRoute 类型的实例.

我们可以把这个方法 和 上面 MVC 的 MapRoute 方法做比较:

MVC:

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)
    {
      ......
      Route route = new Route(url, (IRouteHandler) new MvcRouteHandler())
      {
    ......
      };
    ......
      routes.Add(name, (RouteBase) route);
      return route;
    }

 

是不是非常像!不同的只是 MVC  new 的路由对象是 Route 类型,而 Web API new 的路由对象是 HostedHttpRoute 类型.

讲到这里,其实 ASP.NET Web API 的路由系统还没有和 ASP.NET 的路由系统衔接起来,它们二者的关系仅仅体现在下面这句话:

HttpConfiguration 实际是对 HostedHttpRouteCollection 的封装,而后者是对 RouteTable.Route 的封装. 即 ASP.NET 全局路由表的封装.

但是,当 HostedHttpRoute 创建后,调用 HostedHttpRouteCollection 的 Add 方法添加时,衔接就真正开始了:

public override void Add(string name, IHttpRoute route)
        {
            _routeCollection.Add(name, route.ToRoute());
        }
 

 _routeCollection 是 RouteCollection 类型,没看错,就是 ASP.NET 路由系统的 RouteCollection .

所以,这句代码实际是向 ASP.NET 路由系统的路由集合中添加路由,目的就是为了让 UrlRoutingModule 能够拦截到匹配了 Web API 注册的路由的请求.

但是,问题来了,从上面 MVC 的讲解中我们知道, ASP.NET 路由系统的 RouteCollection 是一个继承自 Collection<RouteBase> 的子类, RouteBase 是 ASP.NET 路由的基类,

而 HostedHttpRoute 是实现了 IHttpRoute 接口的实例, 

IHttpRoute  和 RouteBase 风马牛不相接啊!

所以,添加时,Web API 通过 HostedHttpRoute  的 ToRoute 方法,将自己转成了 RouteBase 类型!!

这个转化非常简单:

public static Route ToRoute(this IHttpRoute httpRoute)
        {
       ...... HostedHttpRoute hostedHttpRoute = httpRoute as HostedHttpRoute; if (hostedHttpRoute != null) { return hostedHttpRoute.OriginalRoute; }
       ...... }

问题又来了, HostedHttpRoute 类型的 OriginalRoute 是个什么鬼?当然,肯定是个 Route  类型,也就是说,它是一个 ASP.NET 路由系统定义的 Route 类型.那它是怎么来的呢?

我们知道,在 Web API 注册路由时, MapHttpRoute 内部创建了一个 HostedHttpRoute 类型的实例,并且是直接 new 的.

那么我们去看看 HostedHttpRoute 的构造函数:

public HostedHttpRoute(string uriTemplate, IDictionary<string, object> defaults, IDictionary<string, object> constraints, IDictionary<string, object> dataTokens, HttpMessageHandler handler)
        {
            ......
            OriginalRoute = new HttpWebRoute(uriTemplate, routeDefaults, routeConstraints, routeDataTokens, HttpControllerRouteHandler.Instance, this);
            ......
        }

OriginalRoute 原来是一个 HttpWebRoute 类型,而 HttpWebRoute 则是 ASP.NET 路由系统定义的 Route 类型的子类.

并且,创建 HttpWebRoute 类型的实例时,传入了一个 ASP.NET 路由系统定义的 IRouteHandler 类型的实例 : HttpControllerRouteHandler.Instance

而 HttpControllerRouteHandler 的 GetHttpHandler 方法如下:

/// <summary>
        /// Provides the object that processes the request.
        /// </summary>
        /// <param name="requestContext">An object that encapsulates information about the request.</param>
        /// <returns>
        /// An object that processes the request.
        /// </returns>
        protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            return new HttpControllerHandler(requestContext.RouteData);
        }

返回了一个 HttpControllerHandler 类型的实例.

HttpControllerHandler 类型的XML注释则非常清晰的解释了它的作用:

  /// 用于将 ASP.NET 请求传递给管道并写回结果。</summary>

这里说的管道,自然就是 Web API 的消息处理管道了.

 

总结:

ASP.NET MVC 和 ASP.NET Web API 都是通过 UrlRoutingModule ,在 PostResolveRequestCache 事件实现对请求的拦截.

拦截后,通过对HTTP上下文,路由等一系列处理后,

MVC 创建了 MvcHandler 进行具体的请求处理及响应;

Web API 创建了 HttpControllerHandler 进行具体的请求处理及响应.

原文出处:https://www.cnblogs.com/refuge/p/10505565.html

今天关于什么是带有 MVC Angular 和 Kendo 的 ASP.NET Web 应用程序?mvc有什么作用的分享就到这里,希望大家有所收获,若想了解更多关于ASP.net Core 3.1 Web 应用程序在 IFrame 中调用另一个 ASP.NET Core 应用程序 url 会重置身份,任何其他页面都重定向到登录页面、ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门、ASP.NET Core 或 ASP.NET Core MVC 解决方案无法运行,IIS Express 抛出 HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动、ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?等相关知识,可以在本站进行查询。

本文标签: