كسر رأسي للحصول على توجيه URL في بيئة استضافة IIS 7:أسب.نت

StackOverflow https://stackoverflow.com/questions/1607930

  •  05-07-2019
  •  | 
  •  

سؤال

أحاول تنفيذ توجيه URL لـ ASP.NET باستخدام ملف System.Web.Routing.ويبدو أن هذا يعمل بشكل جيد على المضيف المحلي الخاص بي، ولكن عندما أقوم بالبث المباشر، أتلقى الخطأ 404 الخاص بـ IIS 7 (لم يتم العثور على الملف).لمعلوماتك، الاستضافة تستخدم Windows Server 2008 IIS7.

أعتقد أن هذا يحدث بعض الاختلاف في التعامل مع آلية التوجيه.لكنني غير قادر على معرفة ما يحدث بالضبط.فيما يلي الإعدادات والتغييرات التي أجريتها حتى الآن لتشغيلها ولإعطاء بعض الفضل لنفسي، فهي تعمل بشكل جيد تمامًا محليًا.

إعدادات Web.Config

ثم لدي قسم system.webserver الذي يحتوي على العلامات التالية

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      <add name="UrlRoutingModule"
               type="System.Web.Routing.UrlRoutingModule, 
                   System.Web.Routing, Version=3.5.0.0, 
                   Culture=neutral, 
                   PublicKeyToken=31BF3856AD364E35" />

    </modules>
    <handlers>
      <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </handlers>   

</system.webServer>

ثم في قسم Application_Start قمت بتحديد مسار واحد كما يلي:

void Application_Start(object sender, EventArgs e) 
{
    RegisterRoutes(RouteTable.Routes); 
}
void RegisterRoutes(RouteCollection routes)
{               
    routes.Add(
       "MyRoute",
          new Route("ProductDetail/{ProductId}/{ProductName}",
                new MyRouteHandler("~/ProductDetail.aspx")));
}

وأخيرًا يبدو MyRouteHandler كما يلي:

 public IHttpHandler GetHttpHandler(RequestContext requestContext)
 {
     var display = (Page)BuildManager.CreateInstanceFromVirtualPath(
                     _virtualPath, typeof(Page));
     HttpContext.Current.Items["ProductId"] = requestContext.RouteData.Values["Product"]; 
     return display;
 }

وفي الصفحة الموجهة، أقوم بالحصول على معرف المنتج على النحو التالي

ProductId = (int)HttpContext.Current.Items["Product"];

وهذه هي نهاية الفوضى بلدي.وهذا يعمل بشكل جيد محليا.لقد كنت أحاول هذا لفترة من الوقت لكنني لم نجح حتى الآن.

أي مساعدة سوف تكون محل تقدير كبير.

شكرًا...

هل كانت مفيدة؟

المحلول

لست متأكدًا مما إذا كنت قادرًا على معرفة المشكلة... ولكن إذا كنت لا تزال تبحث عن حل، فيمكنك تجربة ما يلي.لقد اضطررت إلى مواجهة نفس الموقف منذ بعض الوقت وجعلته يعمل باستخدام قواعد إعادة الكتابة في تكوين الويب والتي لن تحتاج إلى أي آلية توجيه لها.لذا، أود أولاً أن أشجعك على إزالة أي إعداد توجيه قد يكون لديك والرمز الموجود في ملف Global.asax أيضًا.

ثم في القسم يمكنك إضافة قواعد إعادة الكتابة على النحو التالي

<rewrite>
    <rewriteMaps>
        <rewriteMap name="map1" defaultValue="(.+)"/>
    </rewriteMaps>
    <rules>
        <rule name="Rewrite rule1 for map1">
        <match url="product/(.+)/(.+)"/>
        <conditions>
            <add input="{map1:{REQUEST_URI}}" pattern="(.+)"/>
        </conditions>
        <action type="Rewrite" url="productdetail.aspx?Product={R:1}" appendQueryString="false" redirectType="Permanent"/>
        </rule>
    </rules>
  </rewrite>

إذا كانت لديك مشاكل في فهم آلية إعادة الكتابة، أنصحك بقراءتها هذا المقال بواسطة سكوت جوثري.

أعتقد أن هذا يجب أن يناسبك نظرًا لبيئة IIS 7.0 أو 7.5.

نصائح أخرى

لقد تابعت هذا المقال:كيف:استخدم التوجيه مع نماذج الويب

قبل أن أجده، كنت أواجه مشكلات في مضيفي المشترك ولم يكن هناك أي مشكلات على المستوى المحلي.لقد كان ملف web.config الخاص بي.

كان مضيفي يستخدم IIS 7 مع خط الأنابيب المتكامل، وكنت أفتقد هذا:

<handlers>
    <!---after all the others--->       
    <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*"
             path="UrlRouting.axd"
             type="System.Web.HttpForbiddenHandler,
             System.Web, Version=2.0.0.0,
             Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</handlers>

يحرر:وفقًا لإعداداتك ورمزك، الشيء الوحيد المتبقي هو التحقق لمعرفة ما إذا كان لديك ملف التوجيه dll المحدد في web.config وتم نشره أيضًا في دليل bin الخاص بك:

<add assembly="System.Web.Routing, Version=3.5.0.0, 
  Culture=neutral, 
  PublicKeyToken=31BF3856AD364E35"/>

جرب هذا في web.config.عملت بالنسبة لي.

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

فقط لإبلاغ ما كان الحل في النهاية ...على IIS7 قم بتغيير وضع خط الأنابيب إلى متكامل وتابعت إضافة بعض الأسطر على web.config من الرابط أعلاه...http://msdn.microsoft.com/en-us/library/cc668202.aspx

حظ سعيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top