web-gelistirme-sc.com

URL'deki noktalar ASP.NET mvc ve IIS ile 404'e neden olur

URL'lerin yolunda noktalar olmasını gerektiren bir projem var. Örneğin, www.example.com/people/michael.phelps gibi bir URL’m olabilir.

Noktalı URL'ler bir 404 oluşturur. Yönlendirmem iyi durumda. Michaelphelp'leri nokta olmadan geçirirsem, o zaman her şey çalışır. Nokta eklersem 404 hatası alıyorum. Örnek site, Windows 7'de IIS8 Express ile çalışıyor. URLScan çalışmıyor.

Aşağıdakileri web.config dosyasına eklemeyi denedim:

<security>
  <requestFiltering allowDoubleEscaping="true"/>
</security>

Ne yazık ki bu bir fark yaratmadı. Sadece bir 404.0 Bulunamadı hatası alıyorum.

Bu bir MVC4 projesi ama bunun alakalı olduğunu sanmıyorum. Yönlendirmem iyi çalışıyor ve beklediğim parametreler bir nokta içerene kadar oradalar.

URL'mde nokta olması için yapılandırmam gerekenler nelerdir?

291
Mark

Bu çalışmayı sitemin HTTP işleyicilerini düzenleyerek aldım. İhtiyaçlarım için bu iyi çalışıyor ve sorunumu çözdü.

Belirli yol ölçütlerini arayan yeni bir HTTP işleyicisi ekledim. İstek eşleşiyorsa, işleme için doğru şekilde .NET'e gönderilir. URLRewrite’ın RAMMFAR’ı hacklediği veya etkinleştirdiği bu çözüm ile çok daha mutluyum.

Örneğin, .NET’in URL’yi işlemesini sağlamak için www.example.com/people/michael.phelps, system.webServer / handlers öğesinde sitenizin web.config dosyasına şu satırı ekleyin:

<add name="ApiURIs-ISAPI-Integrated-4.0"
     path="/people/*"
     verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
     type="System.Web.Handlers.TransferRequestHandler"
     preCondition="integratedMode,runtimeVersionv4.0" />

Düzenle

Bu sorunun çözümünün RAMMFAR veya RunAllManagedModulesForAllRequests olduğunu bildiren başka yayınlar da var. Bu seçeneğin etkinleştirilmesi, tüm talepler için yönetilen tüm modülleri etkinleştirir. Bu, görüntüler, PDF'ler ve diğerleri gibi statik dosyalar olması gerekmediğinde .NET tarafından işleneceği anlamına gelir. Bu seçenek, özel bir durumunuz olmadığı sürece bırakılabilir.

365
Mark

Etrafa biraz düştükten sonra, gevşemişUllToFileSystemMapping'in benim için hiç işe yaramadığını ve benim durumumda işe yarayanın RAMMFAR'ı true olarak ayarladığını fark ettim, aynı (.net 4.0 + mvc3) ve (.net 4.5 + mvc4) için de geçerlidir.

<system.webserver>
    <modules runAllManagedModulesForAllRequests="true">

RAMMFAR değerini ayarlarken dikkat edin Hanselman RAMMFAR ve performans hakkında bilgi verir

46
Tadeu Maia

Web.config'inizde relaxedUrlToFileSystemMapping özelliğini ayarlamanız gerektiğine inanıyorum. Haack kısa bir süre önce bununla ilgili bir makale yazdı (ve bazıları da var SO gönderileri aynı tipte soruları sormak)

<system.web>
<httpRuntime relaxedUrlToFileSystemMapping="true" />
25
Tommy

Tüm bu çareleri boşuna takip ederek uzun süre bu konuda takılıp kaldım.

Noktaları [.] İçeren URL'nin sonuna eğik çizgi [/] eklerken, 404 hatası atmadığını ve gerçekten çalıştığını fark ettim.

Sonunda, belirli bir deseni izlemek ve eğitim eğimini eklemek için IIS URL Yeniden Yazma gibi bir URL yazıcısı kullanarak sorunu çözdüm.

URL’m şuna benziyor: /Contact/~firstname.lastname bu yüzden modelim basitçe: /Contact/~(.*Г^/ Orleans)$

Bu fikri Scott Forsyth'tan aldım, aşağıdaki bağlantıya bakın: http://weblogs.asp.net/owscott/handing-mvc-paths-with-dots-in-the-path

23
Leon van Wyk

Bu bölümü Web.config dosyasına eklemeniz yeterlidir,/{* pathInfo} yoluna yapılan tüm istekler, pathInfo öğesinde noktalar olsa bile, belirtilen işleyici tarafından gerçekleştirilir. (ServiceStack MVC Host Web.config örneğinden ve bu cevabdan alınmıştır https://stackoverflow.com/a/12151501/801189 )

Bu, hem IIS 6 & 7 için çalışmalı. 'Rota' sonrası '=' elemanlarında = = * * "değiştirerek farklı yollara özel işleyiciler atayabilirsiniz.

  <location path="route">
    <system.web>
      <httpHandlers>
        <add path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" />
      </httpHandlers>
    </system.web>
    <!-- Required for IIS 7.0 -->
    <system.webServer>
      <modules runAllManagedModulesForAllRequests="true" />
      <validation validateIntegratedModeConfiguration="false" />
      <handlers>
        <add name="ApiURIs-ISAPI-Integrated-4.0" path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" preCondition="integratedMode,runtimeVersionv4.0" />
      </handlers>
    </system.webServer>
  </location>
21
V.B.

MVC 5.0 Geçici Çözüm.

Önerilen cevapların birçoğu MVC 5.0'da çalışmıyor gibi görünüyor.

Son bölümdeki 404 nokta problemi, o bölümü takip eden bir eğik çizgiyle kapatarak çözülebileceğinden, işte kullandığım küçük numara, temiz ve basit.

Sizce uygun bir yer tutucu tutarken:

@Html.ActionLink("Change your Town", "Manage", "GeoData", new { id = User.Identity.Name }, null)

işi bitirmek için küçük bir jquery/javascript ekleyin:

<script>
    $('a:contains("Change your Town")').on("click", function (event) {
        event.preventDefault();
        window.location.href = '@Url.Action("Manage", "GeoData", new { id = User.Identity.Name })' + "/";
    });</script>

lütfen sondaki eğik çizgiyi not alın, bu değişiklikten sorumludur

http://localhost:51003/GeoData/Manage/[email protected]

içine

http://localhost:51003/GeoData/Manage/[email protected]/
6
Luke

Sadece bir web sayfasında bu olanlar için süper kolay cevap. Actionlink'inizi ve bunun sonunda bir + "/" düzenleyin.

  @Html.ActionLink("Edit", "Edit", new { id = item.name + "/" }) |
4
Jeremy Hobbs

URI'nizi querystrings olmadan tutmanın sizin için ne kadar önemli olduğuna bağlı olarak, değeri URI yerine değil, querystring'in bir parçası olarak noktalarla geçebilirsiniz.

Örneğin. Herhangi bir ayarı veya herhangi bir şeyi değiştirmek zorunda kalmadan www.example.com/people?name=michael.phelps çalışacaktır.

Temiz bir URI'ye sahip olmanın zerafetini kaybedersiniz, ancak bu çözüm herhangi bir ayar veya işleyicinin değiştirilmesini veya eklenmesini gerektirmez.

2
GR7

Noktalar yerine kısa çizgiler kullanmayı düşünebilirsiniz.

Pro ASP MVC 3 Framework , arkadaşça URL'ler oluşturma konusunda bunu önerir:

Sembollerden, kodlardan ve karakter dizilerinden kaçının. Bir Word ayırıcı istiyorsanız, bir çizgi (/ my-great-article) kullanın. Alt çizgiler dostça değildir ve URL kodlu alanlar tuhaftır (/ my + great + makale) veya iğrençtir (/ my% 20great% 20article).

Ayrıca, URL’lerin insanlar için okunması ve değiştirilmesinin kolay olması gerektiğini de belirtir. Belki nokta yerine kısa çizgi kullanmayı düşünmenin bir nedeni de aynı kitaptan geliyor:

HTML sayfaları için dosya adı uzantılarını kullanmayın (.aspx veya .mvc), ancak bunları özel dosya türleri için (.jpg, .pdf, .Zip, vb.) Kullanın. Web tarayıcıları, MIME türünü uygun şekilde ayarlarsanız dosya adı uzantılarıyla ilgilenmezler, ancak insanlar hala PDF dosyasının .pdf ile bitmesini bekliyorlar

Bu yüzden, bir periyot hala insanlara okunabilirken (kısa çizgilerden, IMO'dan daha az okunabilir olsa da), periyottan sonra ne olduğuna bağlı olarak biraz kafa karıştırıcı/yanıltıcı olabilir. Ya birinin soyadı zip ismi varsa? Ardından URL,/John-Zip yerine /John.Zip olacaktır; bu, uygulamayı yazan geliştiriciye bile yanıltıcı olabilir.

2
sdm350

Yukarıdaki tüm çözümleri denedim ama hiçbiri benim için işe yaramadı. İşimi yapan çok dilli sürümleri de dahil olmak üzere .NET sürümleri> 4.5 kaldırarak oldu; Sonunda yeni (sadece ingilizce) sürümleri parça parça ekledi. Şu anda sistemime yüklü sürümler şudur:

  • 2.0
  • 3.0
  • 3,5 4
  • 4.5
  • 4.5.1
  • 4.5.2
  • 4.6
  • 4.6.1

Ve hala bu noktada çalışıyor. 4.6.2'yi kurmaya korkuyorum çünkü her şeyi mahvedebilir.

Bu yüzden sadece 4.6.2 ya da İngilizce olmayan versiyonların hepsinin yapılandırmamı karıştırdığını söyleyebilirim.

HTH biri.

1
jokab

URL yapınızı değiştirmek mümkün müdür?
Üzerinde çalıştığım şey için bir rota denedim.

url: "Download/{fileName}"

ama olan bir şeyle başarısız oldu. içinde.

Rotayı değiştirdim

    routes.MapRoute(
        name: "Download",
        url:  "{fileName}/Download",
        defaults: new { controller = "Home", action = "Download", }
    );

Şimdi localhost:xxxxx/File1.doc/Download yazabilirim ve iyi çalışıyor.

Görünümdeki yardımcılarım da bunu öğrendi

     @Html.ActionLink("click here", "Download", new { fileName = "File1.doc"})

bu da localhost:xxxxx/File1.doc/Download formatına da link veriyor.

Belki de "/ view" gibi gereksiz bir Kelime veya rotanızın sonuna harekete geçebilirsiniz, böylece mülkünüzün bir iz bırakması ile sonuçlanabilir / _ gibi bir şey /mike.smith/view

1
jonduncan05

Değişen yol kadar basit = "." yol = "". Web.config dosyasındaki ExensionlessUrlHandler-Integrated-4.0 yolundaki noktayı kaldırın.

İşte Güzel bir makale https://weblog.west-wind.com/posts/2015/Nov/13/Serving-URLs-with-File-Extensions-in-an-ASPNET-MVC-Application

1
Jonny

Web.config arşivine URL Yeniden Yazma kuralı ekleyin. IIS'de zaten (URL Rewrite module kurulu olmalıdır. Aşağıdaki yeniden yazma kuralını kendiniz için ilham kaynağı olarak kullanın.

<?xml version="1.0" encoding="utf-8"?>
<configuration>

<system.webServer>
  <rewrite>
    <rules>
      <rule name="Add trailing slash for some URLs" stopProcessing="true">
        <match url="^(.*(\.).+[^\/])$" />
          <conditions>
              <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
              <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Redirect" url="{R:1}/" />
      </rule>
    </rules>
    </rewrite>
</system.webServer>

</configuration> 
0
Amadeus Sánchez

Ayrıca, (ilgili) işleyici eşlemelerinizin sırasını da kontrol edin. Ondan sonra yolunda bir .svc (ör. /Foo.asmx/bar.svc/path) olan bir .ashx vardı. .Svc eşlemesi, .asmx'den önce eşleşen .svc yolu için ilk 404'tür. Çok fazla düşünmedim ama belki yolu kodlayan URL bununla ilgilenir.

0
stuartm9999
0
user1454265

Çözüm, base64 olarak, sembol. içermeyen bir biçime kodlamayı da düşünebilir.

Js de eklenmeli

btoa(parameter); 

Kontrolörde

byte[] bytes = Convert.FromBase64String(parameter);
string parameter= Encoding.UTF8.GetString(bytes);
0
Max Booreviy