2012-03-04 27 views
7

Tôi có thể có cùng một url cho cả hai yêu cầu ASP.NET MVC trả về HTML và cho ASP.NET Web API trả về JSON không?ASP.NET Web API có thể hoạt động trên cùng một url với MVC không?

tôi thấy trong ví dụ tuyến đường như thế này: "api/{id}" nhưng tôi có thể thoát khỏi api/ phần này sử dụng địa chỉ này trong MVC (không Web API) quá?

Ở một bên, điều này có thể xảy ra khi chúng tôi có thương lượng nội dung. Nhưng theo cách này, tôi yêu cầu hai tuyến đường có cùng địa chỉ để điều này không có ý nghĩa, đúng không?

Nói cách khác: tôi có thể có ControllerApiController có cùng url không? Hoặc tôi có nên sử dụng ApiController cũng cho HTML không?

Trả lời

5

Như đã nêu trong câu trả lời trước, bạn không thể làm điều đó và tôi thực sự không thể thấy được lý do tại sao bạn muốn làm điều gì đó như thế.

Nhưng tôi không đồng ý rằng bạn nên gắn bó với một thứ trong một dự án duy nhất, nếu bạn muốn có API sạch thì tôi sẽ sử dụng webapi và sử dụng MVC để lưu trữ các trang của tôi, và tại thời điểm đó tôi sẽ có API trong một thư mục riêng biệt cộng với một tuyến đường riêng biệt.

+0

chính xác, giữ chúng là các dự án riêng biệt – RickAndMSFT

+2

@ Rick.Anderson-at-Microsoft.com, tôi không nói bạn nên giữ chúng trong các dự án riêng biệt, điều đó phụ thuộc vào kích thước của api và trang web. Nếu nó là một ứng dụng nhỏ, tôi nghĩ rằng bạn có thể có cả API và trang web trong cùng một dự án và chỉ tách chúng bằng cách có api trong một khu vực nếu có thể. –

1

Không, bạn không thể có một đường dẫn URL duy nhất cho hai lớp khác nhau. Nếu có nhiều tuyến phù hợp với yêu cầu đến, tuyến đầu tiên sẽ được sử dụng.

Tôi không chắc chắn lý do tại sao bạn sẽ cần phải kết hợp hai trong một dự án duy nhất, ít nhất là không có bất kỳ lý do thực tế. ApiController có thể trả về HTML và MVC Controller có thể trả về JSON, vì vậy chỉ cần chọn một và sử dụng nó.

1

Câu trả lời trước đã giải thích tình huống. Một điều cần thêm là, ASP.NET MVC hoặc Web API, tất cả các tuyến đường của bạn được thu thập trong cùng một danh sách. Ví dụ, trên mẫu dự án mặc định, nếu bạn đăng ký tuyến đường ASP.NET MVC trước một API Web, bạn sẽ thấy rằng các yêu cầu dưới đường dẫnđược chọn bởi tuyến đường ASP.NET MVC.

0

Vì Web API sử dụng cùng một hệ thống định tuyến như MVC, nếu bạn có cách nào đó để phân biệt các tuyến đường thì bạn có thể sử dụng cùng một url cơ sở cho cả hai. Bạn sẽ cần một số loại hạn chế tuyến đường để ánh xạ các cuộc gọi api tới api. Ví dụ, đây có thể là tham số chuỗi truy vấn.

Nếu url của bạn giống hệt nhau, thậm chí xuống chuỗi truy vấn, sau đó là không. Bạn đã hết may mắn.

1

Về lý thuyết, bạn có thể sử dụng api web và xây dựng một nhà cung cấp nội dung sẽ trở html (có thể từ dao cạo) khi khách hàng yêu cầu văn bản \ html và json khi khách hàng yêu cầu ứng dụng \ json

3

tôi có thể chơi ma quỷ ủng hộ ở đây, nhưng tôi có thể thấy được lý do tại sao một người nào đó muốn làm điều gì đó như thế này.

Thường thì bạn nên có một biểu diễn HTML của một API trên cùng một URL. Cách tiếp cận này cho phép người dùng nhấp vào và khám phá một API từ bên trong trình duyệt.

Tôi đã nhận được điều này trong WebAPI bằng cách sử dụng trình xử lý tin nhắn tùy chỉnh mà 302 chuyển hướng đến tuyến đường MVC.

public class HtmlMessageHandler : DelegatingHandler 
{ 
    private List<string> contentTypes = new List<string> { "text/html", "application/html", "application/xhtml+xml" }; 

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     if (request.Method == HttpMethod.Get && request.Headers.Accept.Any(h => contentTypes.Contains(h.ToString()))) 
     { 
      HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.Redirect); 

      var htmlUri = new Uri(String.Format("{0}/html",request.RequestUri.AbsoluteUri)); 

      response.Headers.Location = htmlUri; 

      return Task.Factory.StartNew<HttpResponseMessage>(()=> response); 
     } 
     else 
     { 
      return base.SendAsync(request, cancellationToken); 
     } 
    } 
} 

Bit của một hack có thể nhưng nó không được công việc và cá nhân tôi như nó hơn một tùy chỉnh HTML MediaTypeFormatter (mà tôi cũng đã cố gắng);)

+0

Ý tưởng thú vị. Bạn có thể viết một mẫu hoàn chỉnh và đăng nó? – RickAndMSFT

+0

Tôi đã đặt một mẫu hoàn chỉnh trên GitHub. https://github.com/arble/WebApiContrib.MessageHandlers.Html –

+0

Trang @OliverPicton không tìm thấy cho tôi? điều này vẫn còn hoạt động? – Qpirate

2

WebAPI cho phép bạn xác định ràng buộc tuyến đường tùy chỉnh bằng cách thực hiện System.Web.Http.Routing.IHttpRouteConstraint.

Trong ASP.NET MVC thông thường, bạn có thể thực hiện tương tự bằng cách triển khai System.Web.Routing.IRouteConstraint.

Bằng cách này, bạn có thể tạo các tuyến đường chỉ hoạt động cho một tiêu đề HTTP Accept nhất định, ví dụ: "application/json" hoặc "text/html".

+0

câu trả lời duy nhất - ngay tại chỗ – Bond

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