2010-08-25 27 views
25

Tôi có một dịch vụ WCF sống song song với một trang web MVC2. Tôi muốn cho URL của tôi cho dịch vụ trông như thế này:Định tuyến MVC2 với Dịch vụ WCFĐịnh tuyến: Html.ActionLink hiển thị liên kết không chính xác!

http://localhost/projdir/Service

Các trang web MVC là trong giai đoạn phôi thai vì vậy nó vẫn có tất cả các bộ điều khiển soạn sẵn của nó vv

Các mã sau đây làm việc tại cái nhìn đầu tiên trong global.asax:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.Add(new ServiceRoute("Service", new ServiceHostFactory(), 
       typeof(MyService))); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", 
       id = UrlParameter.Optional } // Parameter defaults 
    ); 
} 

Dịch vụ này chỉ xuất hiện ở nơi tôi đã mô tả và hoạt động như được quảng cáo. Tuyệt quá.

Tuy nhiên, tôi chỉ nhận thấy rằng việc đặt mã của tôi theo cách này sẽ thay đổi tất cả các số ActionLink của tôi. Ví dụ, "Giới thiệu" tab trên trang web MVC bây giờ xuất hiện như thế này:

http://localhost/projdir/Service?action=About&controller=Home

Điều này rõ ràng là không chính xác (nó phải được http://localhost/projdir/Home/About/).

Nếu tôi di chuyển thêm ServiceRoute bên dưới cuộc gọi MapRoute() mặc định, sau đó tôi gặp lỗi bộ điều khiển bị thiếu. (Trên thực tế tôi nhận được một "StructureMapControllerFactory đã không trả lại một thể hiện của một bộ điều khiển" lỗi, bởi vì tôi đang có dây với StructureMap, duh, nó không phải là một bộ điều khiển để bắt đầu với.)

Thật thú vị, nó chỉ có vẻ đang ảnh hưởng đến đầu ra của Html.ActionLink(). Tôi có thể nhập theo cách thủ công http://localhost/projdir/Home/About/ và truy cập đúng trang.

Lỗi lầm mới lạ khủng khiếp mà tôi đang mắc phải?

+0

Có thể liên quan? http://stackoverflow.com/questions/1470997/html-actionlink-construct-wrong-link-when-a-non-mvc-route-is-added – roufamatic

Trả lời

18

Thử di chuyển tuyến Dịch vụ sau tuyến MVC. Nhưng để tránh lỗi "bộ điều khiển bị thiếu" mà bạn đã nhận trước đó, hãy thêm tuyến đường MVC với a Route Constraint. Những ràng buộc tuyến đường này có thể là Regex - về cơ bản bạn muốn ràng buộc tuyến đường của bạn là bất kỳ bộ điều khiển nào là không phải là "Dịch vụ". Khi một yêu cầu cho "Dịch vụ" được yêu cầu, nó sẽ làm cho nó rơi qua và tuyến đường dịch vụ WCF của mình.

+2

Cảm ơn! Tôi đã sử dụng 'new {controller ="^{?! Service} "}' làm ràng buộc và nó hoạt động như một sự quyến rũ. Bạn có hiểu tại sao tuyến đường dịch vụ không thể trước tuyến MVC được không? – roufamatic

+0

Mã thông báo {controller} và {action} là các mã thông báo đặc biệt ẩn chứa trong MVC luôn (bạn cũng có thể xác định mã thông báo của riêng mình nhưng đây là các thẻ * luôn luôn * ở đó).Khi bạn đặt tuyến dịch vụ trước, nó không thể tìm thấy các thẻ đó ở bất kỳ đâu trong mẫu mà bạn đã xác định cho tuyến đường của bạn, do đó, nó chỉ thêm chúng dưới dạng chuỗi truy vấn. Vì vậy, nó nhận được khá bối rối khi tuyến đường dịch vụ là lần đầu tiên. Thông thường, bạn muốn đặt hàng các tuyến đường của mình để các tuyến "cụ thể" nhất được xác định trước tiên. Vui mừng khi biết nó đang làm việc cho bạn bây giờ. –

+5

Cảm ơn, điều đó rất hữu ích. Sửa chữa cho các googlers trong tương lai: mẫu tôi đã sử dụng thực sự là '^ (?! Dịch vụ). *' – roufamatic

3

Một giải pháp khác là để kế thừa ServiceRoute và ghi đè lên các phương pháp GetVirtualPath trở null như mô tả here

public class AppServiceRoute : ServiceRoute 
{ 
    public AppServiceRoute(string routePrefix, ServiceHostFactoryBase serviceHostFactory, Type serviceType) 
     : base(routePrefix, serviceHostFactory, serviceType) 
    { 
    } 

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
    { 
     return null; 
    } 
} 

Bằng cách này, đảo ngược bản đồ tuyến đường không bao giờ chọn con đường này cho bất kỳ hành động. Các công việc như một nét duyên dáng

8

tôi giải quyết với điều đó:

 routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new { controller = "^(?!api).*" } 
     ); 
     routes.Add(new ServiceRoute("api", new DataServiceHostFactory(), typeof(dwService))); 

Tôi hy vọng điều này tốt cho bạn

+0

Tuyệt vời - Tôi hoàn toàn quên những bộ lọc đó! CẢM ƠN BẠN! –

Các vấn đề liên quan