我是ServiceStack的新手。我使用版本4.04。ServiceStack - 消息隊列服務(驗證和篩選)
我創建了兩個程序,它們使用Redis隊列來相互通信。 一個是Asp.Net主機另一個是Windows服務。
儘管基本的發送和接收消息運行良好,但在Windows服務程序中爲請求DTO配置驗證時遇到一些問題。
這是我的請求,響應的DTO的驗證:
public class RegisterCustomer : IReturn<RegisterCustomerResponse>
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string CompanyName { get; set; }
public string EMailAddress { get; set; }
public string Password { get; set; }
}
public class RegisterCustomerValidator : AbstractValidator<RegisterCustomer>
{
public RegisterCustomerValidator()
{
RuleFor(m => m.FirstName).NotEmpty();
RuleFor(m => m.LastName).NotEmpty();
RuleFor(m => m.EMailAddress).NotEmpty().EmailAddress();
RuleFor(m => m.Password).NotEmpty().Length(5, 100);
}
}
public class RegisterCustomerResponse
{
public ResponseStatus ResponseStatus { get; set; }
}
這是我配置的驗證部分:
private void configureValidation(Container container)
{
Plugins.Add(new ValidationFeature());
// container.RegisterValidators(typeof(RegisterCustomerValidator).Assembly);
container.Register<IValidator<RegisterCustomer>>(new RegisterCustomerValidator());
}
這是我的服務:
public class RegisterCustomerService : RavenService
{
public RegisterCustomerService(IDocumentSession ravenSession)
: base(ravenSession)
{
}
public RegisterCustomerResponse Any(RegisterCustomer request)
{
Logger.Info("Start: Handel message '{0}' ({1})".Fmt(request.ToString(), request.GetType().Name));
RegisterCustomerResponse result = new RegisterCustomerResponse();
Logger.Info("End: Handel message '{0}' ({1})".Fmt(request.ToString(), request.GetType().Name));
return result;
}
}
- 消息&驗證器位於一個獨立的程序集中。 通過
container.RegisterValidators(typeof(RegisterCustomerValidator).Assembly);
在IOC自動註冊驗證器不是有效的。我通過註冊驗證後:
container.Register<IValidator<RegisterCustomer>>(new RegisterCustomerValidator());
我能夠通過「TryResolve」
我馬上想到我在註冊驗證解決在服務的驗證國際奧委會,請求DTO得到驗證。但看起來情況並非如此:調用者獲取響應並且「ResponseStatus」屬性爲空。
我創建RequestFilter做驗證:
公共類ValidationFilterAttribute:RequestFilterAttribute { 公共覆蓋無效執行(IRequest REQ,IResponse資源,對象requestDto) { 串虛設= 「HelloWorld」 的; } }
,並將其應用到該請求DTO:
[ValidationFilter]
public class RegisterCustomer : IReturn<RegisterCustomerResponse>
{
...
}
「執行」 的方法不被調用。我在這裏錯過什麼?
任何幫助,非常感謝。
您不應該使用Request過濾器,如ValidationFilter,因爲驗證應該自動發生。也驚訝container.RegisterValidators不工作,因爲這是我所使用和需要的。你打電話給你的服務?即通過C#,Ajax,MQ? – mythz
我更新我的問題以添加問題的答案。 – Soernt
我無法更新我的問題!?該驗證適用於Asp.Net項目,但不適用於Windows服務項目。 Windows服務項目僅通過Redis MQ功能處理消息。 AppHost派生自AppHostBase,創建RedisMqServer並通過'mqService.RegisterHandler(ServiceController.ExecuteMessage)'註冊消息處理程序。 –
Soernt