如果您想了解ASP.NET网站还是ASP.NETWeb应用程序?的相关知识,那么本文是一篇不可错过的文章,我们将对asp和.net进行全面详尽的解释,并且为您提供关于ASP.netCore3.1Web
如果您想了解ASP.NET 网站还是 ASP.NET Web 应用程序?的相关知识,那么本文是一篇不可错过的文章,我们将对asp和.net进行全面详尽的解释,并且为您提供关于ASP.net Core 3.1 Web 应用程序在 IFrame 中调用另一个 ASP.NET Core 应用程序 url 会重置身份,任何其他页面都重定向到登录页面、ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?、Asp.Net Web Api - 将 String[] 值从 swagger 传递到 Asp.Net Web API、Asp.Net Web 应用程序 Web.Config 编辑以防止深层链接到子目录中的文件的有价值的信息。
本文目录一览:- ASP.NET 网站还是 ASP.NET Web 应用程序?(asp和.net)
- ASP.net Core 3.1 Web 应用程序在 IFrame 中调用另一个 ASP.NET Core 应用程序 url 会重置身份,任何其他页面都重定向到登录页面
- ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?
- Asp.Net Web Api - 将 String[] 值从 swagger 传递到 Asp.Net Web API
- Asp.Net Web 应用程序 Web.Config 编辑以防止深层链接到子目录中的文件
ASP.NET 网站还是 ASP.NET Web 应用程序?(asp和.net)
当我在 Visual Studio 中启动一个新的 ASP.NET 项目时,我可以创建一个 ASP.NET Web 应用程序或者我可以创建一个
ASP.NET 网站。
ASP.NET Web 应用程序和 ASP.NET 网站有什么区别?为什么我会选择一个而不是另一个?
答案是否会根据我使用的 Visual Studio 版本而有所不同?
答案1
小编典典网站:
网站项目是即时编译的 。 你最终会得到更多的 DLL
文件,这可能会很痛苦。当您在一个目录中有页面或控件需要引用另一个目录中的页面和控件时,它也会出现问题,因为另一个目录可能尚未编译到代码中。另一个问题可能是出版。
如果 Visual Studio 没有被告知要不断地重复使用相同的名称,它将一直为页面生成的 DLL 文件提供新名称。这可能导致有多个包含相同类名的 DLL
文件的紧密副本,这将产生大量错误。Web Site 项目是随 Visual Studio 2005 引入的,但事实证明它并不流行。
Web应用程序:
Web 应用程序 项目是作为插件创建的,现在作为 Visual Studio 2005 SP 1 的一部分存在。主要区别在于 Web
应用程序项目的设计与 Visual Studio 2003 附带的 Web 项目类似。它将在构建时将应用程序编译成单个 DLL
文件。要更新项目,必须重新编译并发布 DLL 文件以进行更改。
Web 应用程序项目的另一个不错的特性是从项目视图中排除文件要容易得多。在网站项目中,您排除的每个文件都使用文件名中的排除关键字重命名。在 Web
应用程序项目中,该项目只跟踪从项目视图中包含/排除哪些文件,而不重命名它们,使事情变得更加整洁。
参考
文章 ASP.NET 2.0 - 网站与 Web
应用程序项目 也给出了为什么使用一个而不是另一个的原因。这是它的摘录:
- 您需要将大型 Visual Studio .NET 2003 应用程序迁移到 VS 2005 吗? 使用 Web 应用程序项目。
- 您想在不创建项目文件的情况下将任何目录作为 Web 项目打开和编辑吗? 使用网站项目。
- 您需要在编译期间添加预构建和构建后步骤吗? 使用 Web 应用程序项目。
- 您需要使用多个 Web 项目构建一个 Web 应用程序吗? 使用 Web 应用程序项目。
- 您想为每一页生成一个程序集吗? 使用网站项目。
- 您更喜欢动态编译和处理页面而不在每个页面视图上构建整个站点? 使用网站项目。
- 您更喜欢单页代码模型而不是代码隐藏模型? 使用网站项目。
Web 应用程序项目与网站项目
(MSDN) 解释了网站和 Web 应用程序项目之间的差异。此外,它还讨论了要在 Visual Studio 中进行的配置。
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 MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?
ASP.NET MVC 的路由实际上是建立在 ASP.NET 的路由系统之上的.

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
Asp.Net Web Api - 将 String[] 值从 swagger 传递到 Asp.Net Web API
如何解决Asp.Net Web Api - 将 String[] 值从 swagger 传递到 Asp.Net Web API
我正在从我的 Asp.Net Web Api 调用外部 API。我正在使用 swagger 测试它,并且从 swagger 我将 DepartmentCodes 数组作为 ["IT","HR"]
传递,当我使用 swagger 测试它时,API 是由于 DepartmenCodes 数组而失败。
我在这里只发布部分代码,因为问题仅在于从 swagger 传递的 string[] 值。
public async Task<IHttpActionResult> GetUsers([FromUri] GetUserRequest getUserRequest)
{
UserRequest userRequest = new UserRequest();
userRequest.DepartmentCodes = getUserRequest.DepartmentCodes;
using (var Client = new HttpClient())
{
//code to call external api
}
}
Public Class UserRequest
{
Public string[] DepartmentCodes {get;set;}
}
Public Class GetUserRequest
{
Public string[] DepartmentCodes {get;set;}
}
当我在代码中对 DepartmentCodes 数组进行硬编码时,API 会按预期工作并且我得到了结果。
public async Task<IHttpActionResult> GetUsers([FromUri] GetUserRequest getUserRequest)
{
UserRequest userRequest = new UserRequest();
userRequest.DepartmentCodes = new string[] {"IT","HR"};
//userRequest.DepartmentCodes = getUserRequest.DepartmentCodes;
using (var Client = new HttpClient())
{
//code to call external api
}
}
为了使 API 与 swagger 一起使用,我们是否必须对代码进行任何更改,或者我是否需要更改从 swagger 传递字符串数组的方式..目前从 swagger 我将字符串数组传递为[“IT,人力资源”]
解决方法
我想通了,当我尝试以下面的方式从 swagger 发布字符串数组值时,它起作用了
IT
HR
不应有任何双引号、逗号或任何其他特殊字符...
Asp.Net Web 应用程序 Web.Config 编辑以防止深层链接到子目录中的文件
如何解决Asp.Net Web 应用程序 Web.Config 编辑以防止深层链接到子目录中的文件
我们正在尝试为 ASP.NET Web 应用程序配置 web.config 文件以防止深度链接到上传的文件,但我们遇到了一些问题。对于某些用户(不是全部),当他们尝试从站点中的网页访问文件时,它会将他们踢回默认页面(登录页面)。然后,一旦他们输入他们的凭据,就会提供文件。其他人似乎没有同样的问题,即使使用相同的帐户并且文件在没有被重定向到登录页面或不必重新输入其凭据的情况下提供。
有人能看出这个配置有什么明显的问题吗?很感谢任何形式的帮助。
我们所做的是将以下内容放入根 web.config 文件中:
<location path="subdir_redacted">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
然后在实际子目录中还有一个 .config 文件:
<configuration>
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
<system.webServer>
<handlers>
<add name="HTML" path="*.html" verb="GET,HEAD,POST,DEBUG" type="System.Web.staticfilehandler" />
<add name="CSS" path="*.css" verb="GET,DEBUG" type="System.Web.staticfilehandler" />
<add name="JS" path="*.js" verb="GET,DEBUG" type="System.Web.staticfilehandler" />
<add name="JPG" path="*.jpg" verb="GET,DEBUG" type="System.Web.staticfilehandler" />
<add name="PNG" path="*.png" verb="GET,DEBUG" type="System.Web.staticfilehandler" />
<add name="PDF" path="*.pdf" verb="GET,DEBUG" type="System.Web.staticfilehandler" />
<add name="DOCX" path="*.docx" verb="GET,DEBUG" type="System.Web.staticfilehandler" />
<add name="DOC" path="*.doc" verb="GET,DEBUG" type="System.Web.staticfilehandler" />
<add name="XLSX" path="*.xlsx" verb="GET,DEBUG" type="System.Web.staticfilehandler" />
<add name="XLS" path="*.xls" verb="GET,DEBUG" type="System.Web.staticfilehandler" />
</handlers>
</system.webServer>
</configuration>
今天关于ASP.NET 网站还是 ASP.NET Web 应用程序?和asp和.net的讲解已经结束,谢谢您的阅读,如果想了解更多关于ASP.net Core 3.1 Web 应用程序在 IFrame 中调用另一个 ASP.NET Core 应用程序 url 会重置身份,任何其他页面都重定向到登录页面、ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?、Asp.Net Web Api - 将 String[] 值从 swagger 传递到 Asp.Net Web API、Asp.Net Web 应用程序 Web.Config 编辑以防止深层链接到子目录中的文件的相关知识,请在本站搜索。
本文标签: