SharePoint IHTTPModuleの奇妙なエラー(カスタム404ページ)
-
09-12-2019 - |
質問
私の404 ASPXページにユーザーをリダイレクトするためのカスタムIHTTPModuleを持っています。
この例はインターネットのどこかで見つかったため、この部分はうまく機能していますが、今日の管理者は次の問題を報告します:
こんにちは
今日はこれに見られ、発見されました。Officeの文書から保存するときには、WebDAV用にトロールするHTTPモジュール「Pagenotfound」であることがわかります。文書を保存するときは、HTTP 302リダイレクトを追加します。これは、文書が存在しない場合にのみ発生し、既存の文書を介して保存してもうまく機能します。Web.Config WebDAVから「PagenotFoundHttpModule」を削除/追加することができます。
.
void ApplicationPreSendRequestContent(object sender, EventArgs e)
{
HttpResponse response = app.Response;
string requestedUrl = app.Request.Url.AbsolutePath;
if (string.IsNullOrEmpty(requestedUrl))
{
LoggingService.WriteError("PageNotFoundHttpModule. PreSend request: HttpApplication Request.Url.AbsolutePath is null ");
return;
}
try
{
var urlElements = requestedUrl.Split('/');
if (urlElements.Length > 0)
{
int pageElementIndex = urlElements.Length - 1;
string pageName = urlElements[pageElementIndex] as string;
if (string.IsNullOrEmpty(pageName))
{
pageName = string.Empty;
}
if (response.StatusCode == 404 && response.ContentType.Equals("text/html", StringComparison.CurrentCulture))
{
var pathLowercase = Constants.PageNotFoundUrl.ToLower().Trim();
var message = string.Format("{0}?oldUrl={1}&k={2}", pathLowercase, requestedUrl, pageName);
if (!pathLowercase.EndsWith(pageName.ToLower().Trim()))
{
response.Redirect(message);
}
}
}
}
catch (Exception ex)
{
LoggingService.WriteError(ex, "PageNotFoundHttpModule. Exception while working");
}
}
ログをチェックし、次の例外を見ます:
.
PageNotFoundHttpModule. Exception while working Thread was being aborted.
at System.Threading.Thread.AbortInternal()
at System.Threading.Thread.Abort(Object stateInfo)
at System.Web.HttpResponse.End()
at PageNotFoundHttpModule.ApplicationPreSendRequestContent(Object sender, EventArgs e).
しかし、私は本当にこのスレッドの何が悪いのか、そしてその理由が中止されたのか知りません。任意のアイデア?
解決 2
httpmethodが掲載されていないことを確認する必要があります。そしてリダイレクトを使うだけです。
app.request.httpmethod!="PropFind"
他のヒント
これはHttpContext の自然な動作です。
ページをリダイレクトしようとすると、現在のスレッドが中止され、システムは例外をスローします。
スレッドが中止したくない場合は、リダイレクトメソッドにFALSEを渡します。
response.redirect(メッセージ、false);