C# インターフェイスを作成し、Contract.dll にコンパイルしました。Contract.dll は、ASP.NET MVC Web サイト (このシナリオではクライアント) および ASP.NET Web API サービスによって参照されます。
Web サイトで Refit を使用してサービスを呼び出します。Refit の Get 属性と Web API の HttpGet 属性で Contract.dll の定数を使用して、サービス メソッドの URL を示してみました。これにより、URL を 1 か所で指定して、クライアントとサービスから参照できるようになります。
クライアント
public static class WidgetServiceUrls
{
public const string ListByName = "/widget/list/{Name}";
}
public interface IWidgetService
{
// Refit requires a string literal URL, not a constant. Ensure the implementing service uses the same URL.
[Get(WidgetServiceUrls.ListByName)]
Task<List<Widget>> List(string Name);
}
サービス
// TODO: Determine how to eliminate duplicate URL string in service controller action and interface method.
[HttpGet(WidgetServiceUrls.ListByName)]
public async Task<List<Widget>> List(string Name)
RestService.For(httpClient) を呼び出すと、Refit は例外をスローします。
IWidgetService は Refit インターフェイスのようには見えません。Refit HTTP メソッド属性を持つ少なくとも 1 つのメソッドがあり、Refit がプロジェクトにインストールされていることを確認してください。
どうやら、Refit は Get 属性の定数を理解していないようです。両方の場所で文字列リテラルを使用すると、コードは正しく実行されます。ただし、URL を 2 か所で繰り返すことにより、 DRYの原則に違反しています。
Refit クライアントと Web API サービス メソッドが同じ URL を使用するように、Contract.dll のインターフェイスに注釈を付けるにはどうすればよいですか?