PDA

View Full Version : بعد از کامپایل، HttpModules کار نمیکنه



javad3151
دوشنبه 02 مهر 1386, 10:34 صبح
سلام
من یه HttpModules (برای کنترل فایلهای درخواستی کاربر) ساختم که توی وی‍ژوال استدیو بدرستی کار میکنه ولی وقتی برنامه را Publish می کنم اصلا کارنمیکنه!!!

Behrouz_Rad
دوشنبه 02 مهر 1386, 11:02 صبح
عجیبه...
در Web.Config چی نوشتی؟

cactuskhan
دوشنبه 02 مهر 1386, 12:07 عصر
عجیبه...
در Web.Config چی نوشتی؟

جناب راد من هم راجع به HttpModules سوال داشتم و تو بخش مربوطه هم مطرح کردم !

لطفا کنید راهنمایی کنید حسابی گیر کردم ! :اشتباه:

Behrouz_Rad
دوشنبه 02 مهر 1386, 12:52 عصر
بله. سوال شما رو دیدم.
میتونستی با دادن پاسخ به سوال من در پست قبلی، یک گام جلو بیفتی!

cactuskhan
دوشنبه 02 مهر 1386, 13:50 عصر
سوال من با سوال ایشون فرق میکنه !!! ایشون میگند تو VS کار میکنه ولی تو PUB کارنمیکنه !
در صورتیکه سوال من اینکه چرا در زمان اجرا اصلا وارد کد من نمیشه !!

Behrouz_Rad
دوشنبه 02 مهر 1386, 13:56 عصر
باز هم به سوال من جواب ندادی.
حداقل من میتونم تفاوت سوال تو و سوال اون رو متوجه بشم!

پ.ن: الان میتونستی دو گام جلو باشی!

cactuskhan
دوشنبه 02 مهر 1386, 14:17 عصر
قبل از اینکه عقب ماندگی گام ها ی من به عدد 10 برسه این WEB.CONFIG من !


<?xml version="1.0"?>
<!--
Note: As an alternative to hand editing this file you can use the
web admin tool to configure settings for your application. Use
the Website->Asp.Net Configuration option in Visual Studio.
A full list of settings and comments can be found in
machine.config.comments usually located in
\Windows\Microsoft.Net\Framework\v2.x\Config
-->
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

<appSettings>
<add key="FCKeditor:UserFilesPath" value="/uploadFiles/"/>
<add key="FCKeditorConfigurations" value="/js/"></add>
<add key="ConnectionString" value="SERVER=.;Initial Catalog=temp;Integrated Security=True"></add>

</appSettings>
<system.web>
<globalization culture="fa-IR" uiCulture="fa"/>
<customErrors mode="Off" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm"/>
<error statusCode="404" redirect="FileNotFound.htm"/>
</customErrors>
<compilation debug="true">
<assemblies>
<add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</assemblies>
</compilation>

</system.web>
</configuration>

cactuskhan
دوشنبه 02 مهر 1386, 14:27 عصر
آیا چیزی توی config جا افتاده !! اسم کلاس من HandleTheme است و تو WebApp گذاشتم !

Behrouz_Rad
دوشنبه 02 مهر 1386, 14:42 عصر
آفرین دوست خوبم. حدس من درست بود.
حالا شما میشه به من بگی که این HttpModule شما چرا در Web.Config تنظیم نشده؟
تا زمانی که در Web.Config هندلر یا ماژولت رو تعریف نکرده باشی، چیزی اجرا نمیشه.

موفق باشید.

cactuskhan
دوشنبه 02 مهر 1386, 14:44 عصر
میشه بگید چطور تعریف کنم ؟

Behrouz_Rad
دوشنبه 02 مهر 1386, 15:58 عصر
<httpModules>
<add name="HandleTheme" type="HandleTheme"/>
</httpModules>

cactuskhan
دوشنبه 02 مهر 1386, 16:29 عصر
شرمنده ام امروز خیلی اذیت کردم ولی
error میده ! کدی که نوشتم رو شما دیدید ؟؟ اون مشکلی نداره !

Could not load type 'HandleTheme'. (C:\Documents and Settings\My Documents\Visual Studio 2005\WebSites\Menu\web.config

Behrouz_Rad
دوشنبه 02 مهر 1386, 16:40 عصر
آها! تو از Namespace استفاده کردی.
پس باید به شکل ذیل پیکربندی کنی:


<httpModules>
<add name="HandleTheme" type="HandleTheme.HandleTheme"/>
</httpModules>


ضمن اینکه هیچ وقت نام Namespace و Class رو یکسان انتخاب نکن.

موفق باشید.

javad3151
دوشنبه 02 مهر 1386, 19:34 عصر
من دقیقا مثال MSDN رو پیاده کردم(HelloWorldModule) و تمام تنظیمات رو هم درست انجام دادم


<configuration>
<system.web>
<httpModules>
<add name="HelloWorldModule" type="HelloWorldModule"/>
</httpModules>
</system.web>
</configuration>

Behrouz_Rad
دوشنبه 02 مهر 1386, 20:58 عصر
جواد جان.
مشکل عجیبیه. میتونی روی هاست دیگه ای امتحان کنی؟

javad3151
سه شنبه 03 مهر 1386, 08:42 صبح
هم روی ویندوز سرور و هم روی ویندوز XP تست کردم، بازهم مشکل داره!!!
فقط یه نکته در مورد کدی که نوشتم


Imports Microsoft.VisualBasic
PublicClass HelloWorldModule
Implements IHttpModule
PublicReadOnlyProperty ModuleName() As [String]
Get
Return"HelloWorldModule"
EndGet
EndProperty
' In the Init function, register for HttpApplication
' events by adding your handlers.
PublicSub Init(ByVal application As HttpApplication) _
Implements IHttpModule.Init
AddHandler application.BeginRequest, _
AddressOfMe.Application_BeginRequest
AddHandler application.EndRequest, _
AddressOfMe.Application_EndRequest
EndSub
PrivateSub Application_BeginRequest(ByVal source AsObject, _
ByVal e As EventArgs)
Dim application As HttpApplication = CType(source, _
HttpApplication)

EndSub
Function isvalid(ByVal filename AsString) AsBoolean
Try
Using connection AsNew SqlConnection(cnstr)
connection.Open()
Dim sql AsString = "exec sp_FilePermission N'" & HttpContext.Current.User.Identity.Name.ToString & "',N'" & filename & "'"
Dim cmd AsNew SqlCommand(sql, connection)
Dim dr As SqlDataReader = cmd.ExecuteReader
If dr.HasRows Then
isvalid = True'User have permission
Else
isvalid = False'user have not permission
EndIf
EndUsing
Return isvalid
Catch ex As Exception
EndTry
EndFunction
PrivateSub Application_EndRequest(ByVal source AsObject, _
ByVal e As EventArgs)
' If HttpContext.Current.Session("userid") = "" Then Exit Sub
Dim filename AsString
Dim StrURL AsString = HttpContext.Current.Request.Url.ToString
If InStr(StrURL.ToLower, "mail_at") <> 0 Then
Dim TestArray() AsString = Split(StrURL, "/")
Dim LastNonEmpty AsInteger = -1
For i AsInteger = 0 To TestArray.Length - 1
filename = TestArray(i)
Next
If isvalid(filename) = FalseThen
HttpContext.Current.Response.Redirect("../usermsg.aspx?msgid=11")
EndIf
EndIf
EndSub
PublicSub Dispose() Implements IHttpModule.Dispose

EndSub
EndClass

دفعه اول دستور redirect روی خود VS هم کار نمیکرد و بدون اینکه خطایی بگیره از این دستور رد میشد، ولی بعد نمی دونم چی شد که درست شد

cactuskhan
سه شنبه 03 مهر 1386, 09:51 صبح
آها! تو از Namespace استفاده کردی.
پس باید به شکل ذیل پیکربندی کنی:


<httpModules>
<add name="HandleTheme" type="HandleTheme.HandleTheme"/>
</httpModules>


ضمن اینکه هیچ وقت نام Namespace و Class رو یکسان انتخاب نکن.

موفق باشید.

ممنون از شما اون مشکل حل شد ! فقط یه چیزی !

من نیاز دارم که توی رویداد Page_PreInit هر صفحه theme اون رو کنترل کنم واسه هم این قسمت رو نوشتم ولی Page همیشه Null میشه و درست کار نمیکنه کجای کار من مشکل داره !؟؟

بازم ممنون !


private void application_BeginRequest(object sender, EventArgs e)
{
Page page = HttpContext.Current.CurrentHandler as Page;
if (page != null)
{
page.EnableTheming = true;
page.PreInit += new EventHandler(Page_PreInit);
}
}
public void Page_PreInit(object sender, EventArgs e)
{
Page page = (Page)sender;
if (page != null)
{
page.Theme = "Default";
}
}

Behrouz_Rad
سه شنبه 03 مهر 1386, 13:44 عصر
javad3151@
یک HttpModule ساده بنویس که فقط یک پیغام رو چاپ می کنه و بعد نتیجه رو بگو. پیکربندی Web.Config رو فراموش نکن.

cactuskhan@
از طریق HttpModule یا HttpHandler نمیتونی روال های پویا برای صفحات تعریف کنی.
برای حالتی که قصد پیاده سازی اون رو داری، باید کلاسی ایجاد کنی که از کلاس Page ارث ببره و روال Page_PreInit رو در اون کلاس پیاده سازی کنی.
در این حالت، تمامی صفحاتی که ایجاد می کنی باید از کلاس جدیدی که ساختی ارث ببرن.

موفق باشید.

cactuskhan
سه شنبه 03 مهر 1386, 14:09 عصر
cactuskhan@
از طریق HttpModule یا HttpHandler نمیتونی روال های پویا برای صفحات تعریف کنی.
برای حالتی که قصد پیاده سازی اون رو داری، باید کلاسی ایجاد کنی که از کلاس Page ارث ببره و روال Page_PreInit رو در اون کلاس پیاده سازی کنی.
در این حالت، تمامی صفحاتی که ایجاد می کنی باید از کلاس جدیدی که ساختی ارث ببرن.

موفق باشید.

نه درست شد ! :چشمک: راهنمایی های شما خیلی کمک کرد ولی یه گشتی هم تو GOOGLE زدم راشو پیدا کردم !

درستش اینکه زمانی که میخوایم تو رویداد Init کلاس یه رویداد new کنیم باید از نوع

PreRequestHandlerExecute باشه نه از BeginRequest همین ! بقیش درسته !


public void Init(HttpApplication application)
{
application.PreRequestHandlerExecute += new EventHandler(application_PreRequestHandlerExecute) ;
}

Behrouz_Rad
سه شنبه 03 مهر 1386, 16:37 عصر
خوشحالم که موفق شدی.
ضمن اینکه سعی کنید تا حد ممکن از Module ها و Handler ها کمتر استفاده کنید.
این دو قابلیت به برنامه سربار تحمیل می کنند. در سلسه مراتب اجرای ماژول ها و هندلرها، سدی جلوی راه Request ها قرار میگیره و Request ها رو بعد از پردازش توسط ماژول یا هندلر مجددا به چرخه ی حیات برنامه وارد میکنه. این دوباره کاری روال اجرای برنامه رو کند میکنه.

موفق باشید.

javad3151
چهارشنبه 04 مهر 1386, 09:31 صبح
دستت درد نکنه ، انشاالله عروسیت
اشکال کار رو متوجه شدم ولی جوابش رو نه!
وقتی یک صفحه aspx. از سرور درخواست میشه این ماژول اجرا میشه ولی من میخوام وقتی فایلهای دیگه مثل jpg هم اجرا بشه

Behrouz_Rad
چهارشنبه 04 مهر 1386, 10:23 صبح
جواد جان، یادمه یک سال پیش در این مورد با هم صحبت کردیم و دلیلش رو بهت گفتم.
در مورد Mapping و IIS
ISAPI تنها پسوندهایی رو هندل می کنه که در IIS تعریف شدند.
اگر دوست داری تا پسوند جدیدی رو به اون معرفی کنی، باید در IIS این کار رو انجام بدی.
بدیهی است که در این حالت برنامه رو حتما باید با IIS اجرا کنی نه وب سرور داخلی ASP.NET 2.0

موفق باشید.

javad3151
چهارشنبه 04 مهر 1386, 10:55 صبح
یعنی باید یه DLL بنویسم و به ISAPI معرفی کنم؟
راحت ترین راه ممکن برای حل مشکل چیه؟

Behrouz_Rad
چهارشنبه 04 مهر 1386, 12:10 عصر
نه. فقط کافیه که پسوند جدید رو به IIS معرفی کنی تا درخواست هایی که شامل این پسوند هستند نیز به طور ساده توسط ISAPI مدیریت بشن.
مثلا در سایت CodeProject حتما دیدی که لینک مستقیم برای دانلود فایل ZIP همراه با مقاله وجود داره اما اگر سعی کنی که اون فایل رو بدون اینکه لوگین کرده باشی دانلود کنی، نمیتونی.

موفق باشید.

Behrouz_Rad
چهارشنبه 04 مهر 1386, 12:17 عصر
این رو هم اضافه کنم که میتونی یک DLL سفارشی برای پردازش درخواست ها ایجاد کنی که در این حالت نیاز به برنامه نویسی سطح پایین (Low-Level) در ASP.NET داری.
آشنایی با اجزای IIS، کلیه ی اتفاقات ریز و درشتی که از ابتدای ایجاد یک Request تا ایجاد Response و ارسال اون برای Client انجام میشه، همه و همه رو باید بدونی...
من برای کامپوننتی که در حال حاضر بر روی اون کار می کنم دارم این کار رو انجام میدم.

موفق باشید.

javad3151
پنج شنبه 05 مهر 1386, 08:46 صبح
خیلی دمت گرم
درست شد

javad3151
پنج شنبه 05 مهر 1386, 09:56 صبح
:گریه::گریه::گریه:

فایل های jpg. رو توی Application mapping اضافه کردم
روی IIS ویندوز XP درسته و هیچ مشکلی نداره ولی روی IIS ویندوز سرور 2003SP2 هیچ کدوم از تصاویر رو نشون نمیده:ناراحت::افسرده:
ضمنا net framewoke. هم دو دقیقا مثل هم هست (از روی یک سی دی نصب کردم)