私が見ることができるあなたの問題に対する答えには2つの部分があります。
複数のリクエスト間でユーザー情報を維持する
通常、MVC API アプリケーションはステートレスです。つまり、リクエスト間で現在のユーザーのセッション状態を保持しません。これは、私が RESTFul API を作成する際に何度も学んだり説教されたりしたことです。
そうは言っても、global.asax.cs に以下を追加することで、MVC Web API でセッション状態を有効にできます。
protected void Application_PostAuthorizeRequest()
{
// To enable session state in the WebAPI.
System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}
リクエストで顧客を承認する
リクエスト URL で示したように、顧客名を追加し、それをキャプチャして、現在の http モジュールが要求時に承認するために呼び出す同じルーチンに渡すことができます。これは、MVC フィルターを使用して行うことができます。
最初に同様の URL パターンを実行して、WebApiConfig.cs で顧客名をキャプチャします。
config.Routes.MapHttpRoute(
name: "WithCustomerApi",
routeTemplate: "api/{customername}/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
次に、各リクエストを処理し、現在のセッション情報をチェックし、必要に応じて承認/顧客検索コードを呼び出し、後で使用するためにセッション状態に保存する API コントローラーに ActionFilter を追加します。または、顧客からの適切な情報が新しい MVC ルートに送信できない場合
したがって、次のような属性を追加します。
[WebApiAuthentication]
public class BaseApiController : ApiController
{
}
次に、次のようなアクション フィルターを作成します (これはテストしていないことに注意してください。方法のパターンとして行っただけです)。
public class WebApiAuthenticationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var routeData = actionContext.ControllerContext.Request.GetRouteData();
var currentContext = HttpContext.Current;
if (routeData.Route.RouteTemplate.Contains("customername"))
{
try
{
var authenticated = currentContext.Request.IsAuthenticated;
if (!authenticated)
{
var customer = routeData.Values["customername"];
// do something with customer here and then put into session or cache
currentContext.Session.Add("CustomerName", customer);
}
}
catch (Exception exception)
{
var error = exception.Message;
// We dont like the request
actionContext.Response = new HttpResponseMessage(HttpStatusCode.BadRequest);
}
}
else
{
// No customer name specified, send bad request, not found, what have you ... you *could* potentially redirect but we are in API so it probably a service request rather than a user
actionContext.Response = new HttpResponseMessage(HttpStatusCode.NotFound);
}
}
}
新しい MVC 5 Web API アプリケーションを作成し、これらのエクストラを追加して、デフォルト値コントローラーにフィルターを配置すると、これが可能なソリューションのデモとして実行されていることがわかるはずです。
すべてが正常に機能する場合、これにより顧客名がエコーバックされます。
[WebApiAuthentication]
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
var session = HttpContext.Current.Session;
if (session != null)
{
return new string[] {"session is present", "customer is", session["CustomerName"].ToString()};
}
return new string[] { "value1", "value2" };
}
}
セッションの保存とAPIでの承認については宗教的な議論がありますが、それらは問題ではありません。お役に立てば幸いです、スティーブ