Apakah mungkin untuk memiliki rute ASP.NET MVC yang menggunakan informasi subdomain untuk menentukan rutenya? Sebagai contoh:
- user1 .domain.com pergi ke satu tempat
- user2 .domain.com pergi ke yang lain?
Atau, bisakah saya membuatnya sehingga keduanya pergi ke controller / action yang sama dengan username
parameter?
asp.net-mvc
routing
asp.net-mvc-routing
Dan Esparza
sumber
sumber
Jawaban:
Anda dapat melakukannya dengan membuat rute baru dan menambahkannya ke koleksi rute di RegisterRoutes di global.asax Anda. Di bawah ini adalah contoh rute kustom yang sangat sederhana:
sumber
Untuk menangkap subdomain sambil mempertahankan fitur perutean MVC5 standar , gunakan
SubdomainRoute
kelas berikut yang berasal dariRoute
.Selain itu,
SubdomainRoute
memungkinkan subdomain secara opsional ditetapkan sebagai parameter kueri , pembuatan,sub.example.com/foo/bar
dan yangexample.com/foo/bar?subdomain=sub
setara. Ini memungkinkan Anda untuk menguji sebelum subdomain DNS dikonfigurasi. Parameter kueri (saat digunakan) diperbanyak melalui tautan baru yang dihasilkan olehUrl.Action
, dll.Parameter kueri juga memungkinkan debugging lokal dengan Visual Studio 2013 tanpa harus mengkonfigurasi dengan netsh atau dijalankan sebagai Administrator . Secara default, IIS Express hanya mengikat ke localhost ketika tidak ditinggikan; itu tidak akan mengikat nama host yang sama seperti sub.localtest.me .
Untuk kenyamanan, panggil
MapSubdomainRoute
metode berikut dariRegisterRoutes
metode Anda seperti yang biasa Anda lakukanMapRoute
:Akhirnya, untuk mengakses subdomain dengan mudah (baik dari subdomain asli atau parameter kueri), akan sangat membantu untuk membuat kelas dasar Pengontrol dengan
Subdomain
properti ini :sumber
Ini bukan pekerjaan saya, tetapi saya harus menambahkannya pada jawaban ini.
Berikut ini solusi hebat untuk masalah ini. Maartin Balliauw menulis kode yang menciptakan kelas DomainRoute yang dapat digunakan sangat mirip dengan perutean normal.
http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx
Penggunaan sampel akan seperti ini ...
;
sumber
SERVER NOT FOUND
kesalahan ... berarti kode tersebut tidak berfungsi untuk saya ... apakah Anda mengatur konfigurasi lain atau apa?Untuk menangkap subdomain saat menggunakan API Web , ganti Pemilih Tindakan untuk menyuntikkan
subdomain
parameter kueri. Kemudian gunakan parameter permintaan subdomain dalam tindakan pengontrol Anda seperti ini:Pendekatan ini memudahkan debugging karena Anda dapat menentukan parameter kueri dengan tangan saat menggunakan localhost alih-alih nama host yang sebenarnya (lihat jawaban perutean MVC5 standar untuk detailnya). Ini adalah kode untuk Pemilih Aksi:
Ganti Pemilih Aksi default dengan menambahkan ini ke
WebApiConfig.Register
:sumber
Ya tetapi Anda harus membuat pengendali rute Anda sendiri.
Biasanya rute tidak mengetahui domain karena aplikasi dapat digunakan untuk domain apa pun dan rute tidak akan peduli dengan satu atau lain cara. Tetapi dalam kasus Anda, Anda ingin mendasarkan controller dan bertindak dari domain, sehingga Anda harus membuat rute kustom yang menyadari domain.
sumber
Saya membuat pustaka untuk perutean subdomain yang dapat Anda buat rute seperti itu. Ini bekerja saat ini untuk .NET Core 1.1 dan .NET Framework 4.6.1 tetapi akan diperbarui dalam waktu dekat. Beginilah cara kerjanya:
1) Peta rute subdomain di Startup.cs
2) Pengendali / HomeController.cs
3) Lib itu juga akan memungkinkan Anda untuk menghasilkan URL dan formulir. Kode:
Akan menghasilkan
<a href="http://user1.localhost:54575/Home/Index">User home</a>
URL yang Dihasilkan juga akan tergantung pada lokasi dan skema host saat ini.Anda juga dapat menggunakan bantuan html untuk
BeginForm
danUrlHelper
. Jika Anda suka, Anda juga dapat menggunakan fitur baru yang disebut tag helpers (FormTagHelper
,AnchorTagHelper
)Lib itu belum memiliki dokumentasi, tetapi ada beberapa tes dan sampel proyek jadi jangan ragu untuk menjelajahinya.
sumber
Di ASP.NET Core , host tersedia melalui
Request.Host.Host
. Jika Anda ingin mengizinkan mengesampingkan host melalui parameter kueri, periksa duluRequest.Query
.Untuk menyebabkan parameter kueri inang menyebar ke URL berbasis rute baru, tambahkan kode ini ke
app.UseMvc
konfigurasi rute:Dan definisikan
HostPropagationRouter
seperti ini:sumber
Setelah menentukan pengendali rute baru yang akan melihat host yang disahkan dalam URL , Anda bisa pergi dengan gagasan Pengontrol dasar yang mengetahui Situs itu sedang diakses. Ini terlihat seperti ini:
ISiteProvider
adalah antarmuka yang sederhana:Saya merujuk Anda ke Blog Luke Sampson
sumber
Jika Anda ingin memberikan kemampuan MultiTenancy ke proyek Anda dengan berbagai domain / subdomain untuk setiap penyewa, Anda harus melihat pada SaasKit:
https://github.com/saaskit/saaskit
Contoh kode dapat dilihat di sini: http://benfoster.io/blog/saaskit-multi-tenancy-made-easy
Beberapa contoh menggunakan inti ASP.NET: http://andrewlock.net/forking-the-pipeline-adding-tenant-specific-files-with-saaskit-in-asp-net-core/
EDIT: Jika Anda tidak ingin menggunakan SaasKit dalam proyek inti ASP.NET Anda, Anda dapat melihat implementasi perutean domain Maarten untuk MVC6: https://blog.maartenballiauw.be/post/2015/02/17/domain -routing-and-resolving-current-tenant-with-aspnet-mvc-6-aspnet-5.html
Namun, intisari tersebut tidak dikelola dan perlu diubah untuk bekerja dengan rilis terbaru dari inti ASP.NET.
Tautan langsung ke kode: https://gist.github.com/maartenba/77ca6f9cfef50efa96ec#file-domaintemplateroutebuilderextensions-cs
sumber
Beberapa bulan yang lalu saya telah mengembangkan atribut yang membatasi metode atau pengontrol ke domain tertentu.
Sangat mudah digunakan:
Anda juga dapat menerapkannya langsung pada pengontrol.
Pembatasan: Anda mungkin tidak dapat memiliki dua rute yang sama pada metode yang berbeda dengan filter yang berbeda. Maksud saya, yang berikut ini dapat menimbulkan pengecualian untuk rute duplikat:
sumber