7

Tôi muốn có thể tiếp nhận phản hồi 404 từ trang web api (iis) khi tài nguyên không tồn tại.Web API 2.2 trả lại 404 tùy chỉnh khi tài nguyên (url) không được tìm thấy

Tôi đã làm nghiên cứu của tôi và đã xem qua chỉ one solution khiến công việc này, nhưng tôi không chắc chắn như thế nào "an toàn" đó là kể từ khi "routeTemplate" chỉ là {* url}

bài này là kinda để yêu cầu giúp đỡ và giải thích.

Ứng dụng của tôi sử dụng MVC và WebAPI ... mẫu này có ảnh hưởng đến MVC không? Có cách nào để thêm "api" với {* url} trong mẫu không? (để đảm bảo chỉ các yêu cầu có ".../api/..." bị ảnh hưởng)

config.Routes.MapHttpRoute("Error404", "{*url}", new { controller = "Error", action = "Handle404" }); 

Có ai đi qua một cách sạch hơn để thực hiện việc này và xử lý 404 trong api web không?

EDIT 1

Đoạn mã trên KHÔNG ảnh hưởng đến các tuyến đường MVC của tôi. Làm cách nào tôi có thể thêm "api" vào "{* url}"? ... nếu đã thử nhiều cách khác nhau và không có súc sắc.

+0

Bạn đã thử "{api/* url}" hoặc "{api * url}" vv ..? –

+0

Tôi gặp vấn đề tương tự, trang web sử dụng cả api và MVC trên web. Làm theo hướng dẫn trong bài viết bạn đã liên kết sẽ phá vỡ định tuyến MVC của bạn. Giải pháp là thay đổi mẫu tuyến đường thành "api/{* url} –

Trả lời

5

Có cùng vấn đề chính xác. Sau khi một số nghiên cứu và thử nghiệm và lỗi, tôi đã có thể tìm thấy một giải pháp làm việc.

Tôi đã đi với một giải pháp RoutePrefix và tôi đã cố gắng để thực hiện một cái gì đó tương tự như cách các bộ điều khiển MVC sử dụng HandleUnknownAction trong bộ điều khiển cơ sở.

Với sự giúp đỡ từ bài đăng này: .NET WebAPI Attribute Routing and inheritance để cho phép con đường thừa kế, tôi tạo ra một bộ điều khiển cơ sở cho các API web của tôi với một phương pháp HandleUnknownAction như thế này:

public abstract class WebApiControllerBase : ApiController { 

    [Route("{*actionName}")] 
    [AcceptVerbs("GET", "POST", "PUT", "DELETE")]//Include what ever methods you want to handle 
    [AllowAnonymous]//So I can use it on authenticated controllers 
    [ApiExplorerSettings(IgnoreApi = true)]//To hide this method from helpers 
    public virtual HttpResponseMessage HandleUnknownAction(string actionName) { 
     var status = HttpStatusCode.NotFound; 
     //This is custom code to create my response content 
     //.... 
     var message = status.ToString().FormatCamelCase(); 
     var content = DependencyService 
      .Get<IResponseEnvelopeFactory>() 
      .CreateWithOnlyMetadata(status, message); 
     //.... 
     return Request.CreateResponse(status, content); 
    } 
} 

Nếu bạn không muốn đi xuống đường dẫn thừa kế, bạn luôn có thể đặt phương thức trực tiếp vào bộ điều khiển mà bạn muốn áp dụng chức năng này.

Điều này cho phép tôi sử dụng tiền tố tuyến đường xử lý thư không tìm thấy tùy chỉnh liên quan đến bộ điều khiển cụ thể vì tôi có cả API công khai và API công khai.

Nếu URL không áp dụng cho ApiContoller trình điều khiển Lỗi mặc định sẽ xử lý không được tìm thấy như bình thường.

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