私は ServiceStack を使用して API を構築していますが、同時に、Razor ビューが HTML をブラウザーに返すことを可能にするプラグインを使用しています。
検証を正しくセットアップして構成しました。これは、対応する Razor ビューで検証メッセージを受け取り、メッセージが正確であるためです。ただし、Razor ビューをまったく変更すると (「まったく」とは、改行を追加してすぐに削除するのと同じくらい簡単なことを意味します)、500 エラーが発生し、空白のページが表示されます。
また、単にページを更新して Razor ビューのスタイルを確認している最中に、検証によって同じ役に立たない 500 エラーが表示された空白のページが返されることもあります。もちろん、検証を削除すると、Razor ビューは 100% の確率で正常にレンダリングされます。
検証を常に機能させるにはどうすればよいですか? 私のコードは単純明快で、ドキュメントで読むことができたすべてのものと一致します。つまり、応答と要求の両方が同じ名前空間にあり、バリデーターが要求にコーディングされます。
これがリクエストDTOです
namespace MyServer.DTO
{
[Validator(typeof(SignUpValidator))]
[Route("SignUp")]
public class SignUp : IReturn<SignUpResponse>
{
public string UserName { get; set; }
public string Email { get; set; }
public string EmailConfirm { get; set; }
public string Password { get; set; }
public string PasswordConfirm { get; set; }
public int UserId { get; set; }
}
}
対応するバリデータは次のとおりです
namespace MyServer.DTO
{
public class SignUpValidator : AbstractValidator<SignUp>
{
public SignUpValidator()
{
RuleSet(ApplyTo.Post, () =>
{
RuleFor(e => e.UserName).NotEmpty();
RuleFor(e => e.Email).NotEmpty();
RuleFor(e => e.EmailConfirm).NotEmpty();
RuleFor(e => e.Password).NotEmpty();
RuleFor(e => e.PasswordConfirm).NotEmpty();
}
);
}
}
}
これが応答です
namespace MyServer.DTO
{
public class SignUpResponse
{
bool DidSucceed { get; set; }
int NewUserId { get; set; }
public ResponseStatus ResponseStatus { get; set; }
}
}
最後に、検証プラグインを構成するコードを次に示します。
Plugins.Add(new ValidationFeature());
Container.RegisterValidators(typeof(SignUpService).Assembly);
ご覧のとおり、すべてが非常に平凡であり、本に基づいていますが、このセットアップは何らかの理由で非常に脆弱です. 対応する Razor ビューを変更すると、前述のエラーが発生します。その後、再び機能するまで繰り返し再コンパイルする必要があります。
また、REST コンソール (Google Chrome 拡張機能) を使用してこれをテストすると、まったく同じURIに投稿すると、次の結果が得られることにも言及する必要があります。
- Content-Type をapplication/jsonに設定- すべてが意図したとおりに機能します。400 応答本文にリストされたエラーを含む応答。
- Content-Type を : application/htmlに設定- 一貫して壊れます。500 応答本文にデータがない応答。
私が見逃している何かがあるに違いありません。
お時間をいただきありがとうございます。お役に立てば幸いです。
再度、感謝します。