我们正在审查该公司系统的异常处理之一,并发现了一些有趣的事情.
大多数代码块(如果不是全部)都在try/catch块中,并且在catch块内部抛出新的BaseApplicationException - 这似乎来自企业库.我在这里遇到了一些麻烦,因为我没有看到这样做的好处.(在任何时候发生另一个例外)其中一个开发人员一直在使用该系统说这是因为该类负责发布异常(发送电子邮件和类似的东西),但他不太确定.在花了一些时间浏览代码之后,我非常有信心地说,这就是收集有关环境的信息而不是发布它.
我的问题是: - 将所有代码包装在try {} catch {}块中并且抛出新的异常是否合理?如果是,为什么?有什么好处?
我的个人意见是,使用HttpModule会更容易,注册Application事件的Error事件,并在模块内部执行必要的操作.如果我们走这条路,我们会错过什么吗?有什么缺点吗?
您的意见非常感谢.
我有一个简单的HTTPModule,它可以进行一些自定义会话状态管理.
public void Init(HttpApplication context)
{
context.AcquireRequestState += new EventHandler(ProcessBeginRequest);
ActivityLogger.LogInfo( DateTime.UtcNow.ToLongTimeString() + " In Init " + HttpContext.Current.Request.Url.AbsoluteUri);
}
Run Code Online (Sandbox Code Playgroud)
和
public void ProcessBeginRequest(object sender, EventArgs e)
{
HttpApplication application = sender as HttpApplication;
ActivityLogger.LogInfo(DateTime.UtcNow.ToLongTimeString() + " In ProcessBeginRequest ");
if (application != null)
{
string requestURL = application.Context.Request.Url.ToString();
ActivityLogger.LogInfo(DateTime.UtcNow.ToLongTimeString() + " In ProcessBeginRequest " + requestURL);
}
return;
}
Run Code Online (Sandbox Code Playgroud)
当我使用断点运行此代码时,我看到即使对于静态文件(如images,js和css)也调用了此模块.有没有人经历过这个?我认为HTTP模块只是挂钩到asp.net页面的http管道中的事件.他们是否也依赖于静态资源?或者只是卡西尼?
环境:VS2008 - cassini服务器
PS:我在沙箱中尝试使用Win2k8 IIS7(有点新),并尝试将其写入日志文件(因为我们没有VS),但无法写入日志文件.我确定它的一些写权限问题.任何人都可以指向我一些资源,它告诉我如何在W2k8中运行带有IIS7的ASP.net时为目录设置写权限
Edit1:我知道使用Integrated管道可以扩展静态和托管资源的http管道 http://aspnet.4guysfromrolla.com/articles/122408-1.aspx和http://learn.iis.net/page.aspx/243/ASPNET集成与- IIS7 /
我们在生产中使用经典管道.但仍然有兴趣了解其他人的经历.
问题2:在集成模式下使用IIS7会降低性能吗?假设您有几个模块与管道连接,性能影响有多大?如果有人可以指出我做了一些基线研究,那将会很好.
我正在创建一个HttpModule,它需要知道在MVC应用程序中设置的Thread.CurrentThread.CurrentCulture的值.该值当前由BaseController设置,但是当我的HttpModule.PostRequestHandlerExecute()方法触发时,它将恢复到文化在页面呈现之前的状态.
我通过使用以下步骤创建一个简单的Web应用程序来重复此操作:
知道为什么.Net会改变这个值或者我怎么能绕过它?线程是一样的,所以.Net中的某些内容必须明确地恢复文化.
我有一个ASP.NET MVC应用程序,有一些RESTful服务,我试图使用自定义基本身份验证来保护它们(它们是根据我自己的数据库进行身份验证).我已经通过编写HTTPModule实现了这一点.
我有一个方法附加到HttpApplication.AuthenticateRequest事件,它在身份验证失败的情况下调用此方法:
private static void RejectWith401(HttpApplication app)
{
app.Response.StatusCode = 401;
app.Response.StatusDescription = "Access Denied";
app.CompleteRequest();
}
Run Code Online (Sandbox Code Playgroud)
此方法附加到HttpApplication.EndRequest事件:
public void OnEndRequest(object source, EventArgs eventArgs)
{
var app = (HttpApplication) source;
if (app.Response.StatusCode == 401)
{
string val = String.Format("Basic Realm=\"{0}\"", "MyCustomBasicAuthentication");
app.Response.AppendHeader("WWW-Authenticate", val);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码添加"WWW-Authenticate"标头,告诉浏览器抛出登录对话框.当我使用Visual Studio的Web服务器进行本地调试时,这非常有效.但是当我在IIS7中运行它时失败了.
对于IIS7,除了匿名之外,我都关闭了内置的身份验证模块.它仍然返回HTTP 401响应,但它似乎正在删除WWW-Authenticate标头.
有任何想法吗?
authentication asp.net-mvc iis-7 httpmodule custom-authentication
可能有一种简单的方法可以做到这一点,但我看不到它......
我创建了一个简单的Http模块,它在PreRequestHandler上启动一个计时器,并停止PostRequestHandler上的计时器来计算页面加载所花费的时间.
然后我创建一些简单的html并将我的结果写入Response.Write.因为我在PostRequestHandler中执行此操作,所以它会在</html>标记之后添加我的结果.这对测试很好,但我需要在页面需要验证的情况下.
我似乎无法弄清楚如何操作Response对象以在</body>标记之前插入我的结果.Response.Write和Response.Output.Write没有这种灵活性,我无法看到使用Response作为字符串的方法.我错过了一些容易的事吗?
我创建了一个HttpModule来捕获审计请求.
对于Web方法的Ajax请求,我还想记录与请求关联的JSON数据.
例如请求
POST /MyPage.aspx/AddRecord HTTP/1.1
x-requested-with:XMLHttpRequest
Accept-Language:en-gb
Referer:http:// fiddlerlocal:5000/AddRecord.aspx
Accept:application/json,text/javascript,/
Content-类型:application/json; charset = utf-8
UA-CPU:x86
Accept-Encoding:gzip,deflate
User-Agent:Mozilla/4.0(兼容; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
主机:fiddlerlocal:5000
内容长度:287
连接:Keep-Alive
Pragma:no-cache
Cookie:.....
{"id" : "282aa3b5-b55f-431C-916e-60433fdb61c0", "日期":"
我已经尝试了各种方法从HttpContext.InputStream中读取JSON({"id":"282aa3b5-b55f-431c-916e-60433fdb61c0","date":"8-6-2010"}).
例1:
StreamReader reader = new StreamReader(request.InputStream);
string encodedString = reader.ReadToEnd(); - ReadToEnd返回一个空字符串
例2:
using(MemoryStream ms = new MemoryStream())
{
byte [] buffer = new byte [request.ContentLength];
request.InputStream.Read(buffer,0,request.ContentLength);
ms.Write(buffer,0,request.ContentLength); - 字节数组包含正确的字节数但每个字节的值为0 …
最近几天我想到了asp.net中的输出缓存.在我的任务中,我需要为这个非常大的项目实现输出缓存.经过几个小时的搜索,我没有找到任何例子.
最流行的使用输出缓存的方式是声明性的,在这种情况下,您需要在要缓存的页面上编写类似这样的内容.
但是,如果您需要缓存整个站点,则必须在项目的所有页面或母版页上编写此文件.这很疯狂.在这种情况下,您无法将所有配置存储在一个位置.所有页面都有自己的配置..
Global.asax可以帮助我,但我的网站包含大约20个web progects和~20个global.asax文件.而且我不想为每个项目复制相同的代码.
出于这些原因,我决定创建HTTPModule.在Init方法中,我订阅了两个事件:
public void Init(HttpApplication app)
{
app.PreRequestHandlerExecute += new EventHandler(OnApplicationPreRequestHandlerExecute);
app.PostRequestHandlerExecute += new EventHandler(OnPostRequestHandlerExecute);
}
Run Code Online (Sandbox Code Playgroud)
在方法"OnPostRequestHandlerExecute"中,我为每个新请求设置输出缓存参数:
public void OnPostRequestHandlerExecute(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
HttpCachePolicy policy = app.Response.Cache;
policy.SetCacheability(HttpCacheability.Server);
policy.SetExpires(app.Context.Timestamp.AddSeconds((double)600));
policy.SetMaxAge(new TimeSpan(0, 0, 600));
policy.SetValidUntilExpires(true);
policy.SetLastModified(app.Context.Timestamp);
policy.VaryByParams.IgnoreParams = true;
}
Run Code Online (Sandbox Code Playgroud)
在"OnApplicationPreRequestHandlerExecute"方法中,我将calback方法设置为缓存验证:
public void OnApplicationPreRequestHandlerExecute(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
app.Context.Response.Cache.AddValidationCallback(new HttpCacheValidateHandler(Validate), app);
}
Run Code Online (Sandbox Code Playgroud)
最后一部分 - 回调验证方法:
public void Validate(HttpContext context, Object data, ref HttpValidationStatus status)
{
if (context.Request.QueryString["id"] == …Run Code Online (Sandbox Code Playgroud) 我把一起使用的ASP.NET Web API文档管理服务,以及性能的一些担忧.
基于IIS/ASP.NET ImageResizer模块的作者Nathanael Jones撰写的这篇文章,我对服务静态文件的"最佳"性能所需的内容有了一些先入之见.正是这样:
HttpModule因为它在ASP.NET管道的早期(较少的管道=更优化),并且结果更容易处理这类事情而不是HttpHandler.Response.WriteFile(filename)比Response.Write(memBuffer)memBuffer是内存中的C#缓冲区更好.Context.RewritePath(virtualPath))更好Response.WriteFile(filename),因为它将使用IIS静态文件处理程序,这是经过优化的.麻烦的是,由于一些奇怪的缓存问题,我仍然无法达到(这里)的底部,我的URL重写技术本身并不表现.
所以现在我想知道更多以Web API为中心的实现,如下所示:
public Task<HttpResponseMessage> DoTheFoo()
{
return Task<HttpResponseMessage>.Factory.StartNew(() =>
{
var response = new HttpResponseMessage();
response.Headers.Add("Content-Disposition", "inline; filename=\"" + attachmentFileName + "\"");
response.Headers.Add("content-type", mimeType);
response.Content = new StreamContent(File.OpenRead("somefile.doc"));
return response;
});
}
Run Code Online (Sandbox Code Playgroud)
对于Web API解决方案,这显然会使事情变得更加简洁,因为服务的文件服务部分可以与控制器中的其他操作一起使用,但它的执行和扩展程度如何?我思考的因素:
我无法组建一个服务器场来测试它以获得真实的性能数据,而且我怀疑将小规模测试结果分解会给出任何准确的结果.那些知情人士,我可以期待什么样的差异?我几乎已经准备好放弃URL重写实现,但如果它会给我一个明显的性能影响,我会坚持下去.
我有一个自定义HttpModule用于身份验证.在模块的AuthenticateRequest事件处理程序中,我检查自定义SSO票证是否可用,并在这种情况下执行一些身份验证逻辑.
如果SSO票证可用但不正确,我想向用户显示友好的错误消息.我希望能够以某种方式设置HTTP状态401(未授权,在身份验证失败时使用)并从http模块传递有意义的错误消息.
然后,我希望MVC应用程序以某种方式获取此信息,并使用它来呈现自定义401错误页面,其中包含来自模块的有意义的错误消息.
什么是在http模块中引发错误的最佳方法,以及使用MVC应用程序显示错误的最佳方法是什么(在MVC应用程序的布局中获取错误消息)?
我有一个HttpModule,它已在许多站点中成功实现.我试图在IIS 8下的Windows 8 PC上实现它并且它没有被加载.配置如下:
作为参考,web.config部分如下.
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="MyModule" type="MyModule.ClassName" />
</modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
我想知道,IIS8中是否有任何新的全局选项可以默认禁用托管的HttpModule?
httpmodule ×10
asp.net ×6
asp.net-mvc ×3
c# ×2
iis-7 ×2
caching ×1
cassini ×1
ihttpmodule ×1
iis ×1
iis-8 ×1
inputstream ×1
json ×1
outputcache ×1
performance ×1
string ×1