2013-07-08 53 views
5

Cách dễ nhất để thiết lập bộ chặn đánh chặn yêu cầu/phản hồi trong ServiceStack sẽ thực thi cho một dịch vụ cụ thể là gì?Thiết bị đánh chặn yêu cầu/phản hồi toàn cầu

Bộ lọc yêu cầu (IHasRequestFilter) hoạt động tốt nhưng bộ lọc phản hồi (IHasResponseFilter) không được kích hoạt nếu dịch vụ trả về mã trạng thái không phải 2xx. Tôi cần lấy lại mã trạng thái được trả về bởi phương thức cũng như đáp ứng DTO (nếu có).

ServiceRunner tùy chỉnh và ghi đè các phương pháp OnBeforeExecuteOnAfterExecute có vẻ hoạt động tốt nhưng tôi thấy nó khá dễ xâm nhập vì dịch vụ cần được thay thế cho toàn bộ ứng dụng và tôi không thể tìm cách tách biệt cho mỗi chức năng các nhiệm vụ cần được thực hiện trong các phương thức đó.

Có một số điểm mở rộng trong ServiceStack mà tôi thiếu mà có cho phép tôi thực thi một số mã trước mỗi phương thức dịch vụ và sau mỗi phương thức dịch vụ không? Plugin sẽ là lý tưởng nhưng làm cách nào tôi có thể đăng ký một số phương thức giả tưởng BeforeExecuteAfterExecute cho phép tôi chạy một số mã tùy chỉnh?


UPDATE:

Ngay sau khi đăng câu hỏi tôi phát hiện ra rằng bộ lọc phản ứng toàn cầu được thực hiện không có vấn đề gì mã trạng thái được trả về bởi các dịch vụ đó là chính xác những gì tôi cần. Vì vậy, một câu hỏi cuối cùng: Có thể truy xuất loại dịch vụ sẽ xử lý yêu cầu trong bộ lọc yêu cầu không? Tôi cần phải kiểm tra xem dịch vụ này được trang trí bởi một số thuộc tính đánh dấu tùy chỉnh.

Trả lời

3

tôi đã tìm ra một giải pháp cho câu hỏi của tôi về làm thế nào để lấy các loại dịch vụ trong một bộ lọc yêu cầu tùy chỉnh/response:

appHost.RequestFilters.Add((req, res, requestDto) => 
{ 
    var metadata = EndpointHost.Metadata; 
    Type serviceType = metadata.GetServiceTypeByRequest(requestDto.GetType()); 

    ... 
} 
+0

Vâng tôi chỉ đang ở giữa trả lời câu hỏi chỉ bạn đến siêu dữ liệu :) Ngoài ra bạn cũng có thể xem siêu dữ liệu ServiceStack có với tuyến [/operations/metadata](http://razor.servicestack.net/operations/metadata) . – mythz

2

IHttpRequest có OperationName. Tôi nghĩ đó là những gì bạn đang có.

+0

Không, đó không phải là những gì tôi theo đuổi. Tôi cần loại dịch vụ ('System.Type') để tôi có thể đọc bất kỳ thuộc tính tùy chỉnh có thể nào mà dịch vụ này có thể đã được trang trí. Tôi đã tìm thấy một giải pháp và sẽ đăng nó như là câu trả lời. –

3

Một ServiceRunner tùy chỉnh và trọng các phương pháp OnBeforeExecute và OnAfterExecute dường như làm việc tốt nhưng tôi thấy nó khá dễ xâm nhập vì dịch vụ Á hậu cần được thay thế cho toàn bộ ứng dụng

Lưu ý nhanh, bạn có thể chọn tham gia và chỉ chọn những yêu cầu nên sử dụng dịch vụ tùy chỉnh, ví dụ:

public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(
    ActionContext actionContext) 
{   
    return useCustomRunner(actionContext.RequestType) 
     ? new MyServiceRunner<TRequest>(this, actionContext) 
     : base.CreateServiceRunner<TRequest>(actionContext); 
} 
Các vấn đề liên quan