我需要在IIS中修改某些HttpRequests(SSAS连接字符串)的内容.基本上,我需要向请求中包含的SOAP添加一个元素.
到目前为止,我的方法是向HttpRequest添加一个Filter,并在过滤器的Read方法中执行更改.据我所知,Read永远不会被执行.
我对Request.Filter的理解是它从IIS处理请求时读取,因此IIS应该看到我修改过的Request.
我正在尝试使用HttpModule实际可行的是我的Filter方法是否正确?
如果是这样,什么会导致Read不被击中?
这是我的代码的简化版本:
public class CustomHttpModule : IHttpModule {
private HttpApplication app;
public string ModuleName {
get { return "CustomHttpModule"; }
}
public void Init(HttpApplication context) {
app = context;
context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
}
void context_PreRequestHandlerExecute(object sender, EventArgs e) {
var request = app.Context.Request;
request.Filter = new CustomHttpFilter(request.Filter);
}
}
public class CustomHttpFilter : Stream {
private Stream outputStream;
public CustomHttpFilter(Stream outputFilter) {
outputStream = outputFilter;
}
public override int Read(byte[] buffer, int offset, int count) …Run Code Online (Sandbox Code Playgroud) 我们正在为ASP.NET应用程序使用进程外会话提供程序(ScaleOut),我们注意到当一个没有正确设置反序列化的对象无意中进入会话时,它最终会导致整个终止的过程.
重现和处理这种情况是它变得更有趣的地方.
在AnyStaObjectsInSessionState中引发了终止进程的异常,其实现非常简单:
internal static bool AnyStaObjectsInSessionState(HttpSessionState session)
{
if (session != null)
{
int count = session.Count;
for (int i = 0; i < count; i++)
{
object obj2 = session[i];
if (((obj2 != null) && (obj2.GetType().FullName == "System.__ComObject"))
&& (UnsafeNativeMethods.AspCompatIsApartmentComponent(obj2) != 0))
{
return true;
}
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪,显示了异常如何终止进程:
An unhandled exception occurred and the process was terminated.
Application ID: /LM/W3SVC/1/ROOT
Process ID: 4208
Exception: System.Runtime.Serialization.SerializationException
Message: …Run Code Online (Sandbox Code Playgroud) 我需要为进入我的应用程序的每个请求检查一些内容(Cookies).
在ASP.NET中我们使用HttpModule来完成这项任务,这个问题应该在MVC中使用什么?一些全局过滤器,或者我也可以使用HttpModuler,在MVC和常规ASP.NET之间的Request PipeLine有什么区别吗?
我在现有网站中实现新的ASP.NET Identity 2.0 Framework使用CA的Identity Minder,它主要使用Request.ServerVariables为所有控件供电.
我要做的是使用与HTTP处理程序在BeginRequest事件中的每个请求上使用CA执行的相同变量填充请求标头,但使用新的标识提供程序.
我知道在BeginRequest事件中我有权从客户端读取cookie,我知道我可以检查OWIN cookie是否存在(名为.AspNet.ApplicationCookie),但我不知道如何解密cookie到从中得到索赔.
我也试过这样做来阅读声明:
Dim identity = CType(Thread.CurrentPrincipal, ClaimsPrincipal)
Dim claim = identity.Claims.SingleOrDefault(Function(c) c.Type = ClaimTypes.Name)
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我得不到任何值,所以我假设在请求管道的早期没有填充Thread.CurrentPrincipal.
但是,此代码确实有效
Dim application As HttpApplication = DirectCast(sender, HttpApplication)
Dim cookie = application.Context.Request.Cookies(".AspNet.ApplicationCookie")
If cookie Is Nothing Then
HttpContext.Current.Request.Headers.Add("SM_SERVERSESSIONID", "NOT Logged in")
Else
HttpContext.Current.Request.Headers.Add("SM_SERVERSESSIONID", "Logged in")
End If
Run Code Online (Sandbox Code Playgroud)
因此,考虑到我可以访问cookie,我想知道是否有任何方法可以解密它,以便我可以阅读我在其中设置的声明.
以下是我在登录页面上设置声明的方式:
Dim claims = New List(Of Claim)()
claims.Add(New Claim(ClaimTypes.Name, user.UserName))
claims.Add(New Claim(ClaimTypes.Email, user.Email))
Dim id = New ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie)
authenticationManager.SignIn(id)
Run Code Online (Sandbox Code Playgroud) 我有一个在godaddy.com注册的网站(在ASP.NET 2.0(C#)中开发)但是当我在我的web.config中添加HttpModule时如下:
<httpModules>
<add type="WwwSubDomainModule" name="WwwSubDomainModule" />
</httpModules>
Run Code Online (Sandbox Code Playgroud)
但它给了我"500内部服务器错误".当我删除上面的标签,然后我的网站工作正常.谁能猜到为什么它会造成这个问题?
我正在运行VS 2008和.NET 3.5 SP1.
我想在我的ASP.NET应用程序中的HttpModule中实现命中跟踪.我想,很简单.但是,我的HttpModule的BeginRequest事件对每个页面命中都会触发两次.该网站现在非常简单......没有安全性,只需要一些数据库工作.应该每页登录一行.为什么这个事件会发射两次?
此外,IHttpModule.BeginRequest实际上第一次运行时(从关闭的Web浏览器)触发第一页时触发的次数不同... ...当我点击数据库为页面提供动态数据时,3次并且只有1次没有命中数据库的页面.无论我是否触摸数据库,它在第一个页面之后每次点击时会触发2次.
有趣的是,Application_BeginRequest(在Global.asax中)始终只触发一次.
这是代码:
using System;
using System.Data;
using System.Data.Common;
using System.Net;
using System.Web;
using BluHeron.BusinessLayer;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
namespace BluHeron.HttpModules
{
public class SiteUsageModule : IHttpModule
{
public void Init(HttpApplication httpApp)
{
httpApp.BeginRequest += OnBeginRequest;
}
static void OnBeginRequest(object sender, EventArgs a)
{
UsageLogger.LogSiteUsage(((HttpApplication)sender).Context.Request);
}
public void Dispose()
{ }
}
public static class UsageLogger
{
public static void LogSiteUsage(HttpRequest r)
{
string ipAddress = GetHostAddress(Dns.GetHostAddresses(Dns.GetHostName()));
string browserVersion = r.Browser.Type;
string[] urlChunks = r.RawUrl.Split('/');
string …Run Code Online (Sandbox Code Playgroud) 我在ASP.NET中实现了一个HttpModule(框架2.0).
从我在服务器上的日志记录中,我可以看到我的HttpModule正在拾取http请求,并且我的代码成功运行(将内容写回Response流).
但是,Web浏览器(IE,FF,Chrome,都是相同的)只是给我一个"连接重置"错误消息.
我检查了服务器上的事件日志; 那里没有相关的错误或消息.
额外信息:当我在FF中使用"Live HTTP Headers"插件时,它甚至不显示我的客户端请求(虽然我确信它到达服务器,因为在服务器日志中捕获了请求).
我如何解决这里发生的事情?
我有一个使用ISAPI Rewrite的站点以及一个自定义的HttpModule,它们都进行了Url重定向和重写.
在IIS 6中,一切正常:首先运行ISAPI Rewrite过滤器,然后运行HttpModule.在IIS 7(集成模式)中,顺序现在是相反的,这会产生问题.
我的问题,特别是,HttpModule有一个条件,它会发出一个Url重写使用context.RewritePath.如果没有提供文档,它将显式地向路径添加"index.aspx",因此请求/test/被重写为/test/index.aspx.
在重写路径之后的某个时刻,执行ISAPI重写过滤器.我们有一个与模块相反的规则:/test/index.aspx获取301重定向的请求/test/.因此,我们有一个无限循环.
如何在IIS 7中确定HttpModules和ISAPI过滤器的执行顺序?订单可以更改吗?我发现了这个问题,但它并没有真正帮助.我不是IIS 7的主人,但我确实在某种程度上理解模块和ISAPI过滤器"一起"运行.不幸的是,他们的管理方式不同,我无法弄清楚如何强迫一个人跑到另一个人面前.救命!
注意:我们假设我无法更改现有代码.它在IIS 6中有效.我只想知道是否有办法使其在IIS 7集成模式下工作.
我已经下载了MVC 3的源代码,以了解它是如何运行的.
许多人说MVC拦截了UrlRouting Moudle Class的Http请求.
我知道当你定制一个HttpModule时,你需要像这样注册它:
<system.webServer>
<modules>
<add name="test" type="WebApplication2.MyModule1,WebApplication2"/>
</modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
所以Asp.net mvc应用程序的Web.config文件应该有配置部分:
<add name="UrlRoutingModule"
type="System.Web.Routing.UrlRoutingModule,..." />
Run Code Online (Sandbox Code Playgroud)
但是当我创建一个新的Asp.net MVC应用程序时,我无法在web.config文件中找到它.
有人说IIS 7会自动添加它.
什么时候到IIS7添加配置部分?
IIS7如何区别它是MVC应用程序还是WebForm?
我有一个用asp.net编写的应用程序,我在网站中集成了一些传统的经典asp页面.该站点使用Windows身份验证.因为我无法管理带有角色的.asp页面,所以我编写了一个自定义HttpModule来检查用户是否有权查看这些页面,否则会重定向到"拒绝访问"页面.主要问题是应用程序需要在IIS7上以"经典模式"运行.我的模块在集成模式下工作,但在经典模式下不工作.有没有理由这个代码也不能在经典模式下工作?提前致谢.
这是模块的代码,它非常简单:
public class MyModule: IHttpModule
{
public void Init(HttpApplication application)
{
application.PostAuthenticateRequest += new EventHandler(Application_PostAuthenticateRequest);
}
void Application_PostAuthenticateRequest(object source, EventArgs e)
{
HttpApplication app = (HttpApplication)source;
HttpContext context = ((HttpApplication)source).Context;
if (context.Request.RawUrl.Contains("/protected-subfolder/"))
{
// gets user from windows authentication
string currentUser = Convert.ToString(context.User.Identity.Name);
if (!isAdmin(currentUser))
{
//deny access
(context.Response).Redirect(VirtualPathUtility.ToAbsolute("~/AccessDenied.aspx"));
}
}
}
public void Dispose(){ }
Run Code Online (Sandbox Code Playgroud)
这是经典模式的web.config中的设置(不工作):
<configuration>
<system.web>
<httpModules>
<add name="MyModule" type="MyModule" />
</httpModules>
</system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)
并且集成模式(工作)的设置:
<configuration>
<system.webServer>
<modules>
<add name="MyModule" type="MyModule"/>
</modules>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer> …Run Code Online (Sandbox Code Playgroud) httpmodule ×10
asp.net ×8
iis-7 ×3
asp.net-mvc ×2
.net ×1
c# ×1
cookies ×1
httprequest ×1
iis ×1
isapi ×1
owin ×1
restart ×1
session ×1
ssas ×1
web-config ×1