まあ、デザインによるRESTはステートレスです。セッション(またはその種のもの)を追加することで、ステートフルになり、RESTful APIを持つ目的を破ります。
RESTfulなサービスの全体的なアイデアは、すべてのリソースは、各HTTPリクエストは完全に調和にあると、それを処理するために、その受取人のために、それ自体で十分な情報を伝える必要がありハイパーメディアリンクとで使用するための汎用構文を使用して一意にアドレス指定可能であるということですですから、ここでのWeb APIをどうしようとしているものは何でも
。HTTP」のステートレスな性質を持つ、最も可能性の高い再アーキテクチャ・べきであるあなたがRESTfulなAPIを持っているしたい場合。
ということで、もしあなたはまだそのルートを下りたいと思っています。seを追加するためのハッキーな方法があります
public class MyHttpControllerHandler
: HttpControllerHandler, IRequiresSessionState
{
public MyHttpControllerHandler(RouteData routeData): base(routeData)
{ }
}
public class MyHttpControllerRouteHandler : HttpControllerRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MyHttpControllerHandler(requestContext.RouteData);
}
}
public class ValuesController : ApiController
{
public string GET(string input)
{
var session = HttpContext.Current.Session;
if (session != null)
{
if (session["Time"] == null)
{
session["Time"] = DateTime.Now;
}
return "Session Time: " + session["Time"] + input;
}
return "Session is not availabe" + input;
}
}
をして、あなたのAPIのルートにHttpControllerHandlerを追加します:ウェブAPIへssion、そしてそれはイムランによって投稿されていますが、ここでhttp://forums.asp.net/t/1780385.aspx/1
コードは(私は実際にそれをお勧めしませんが)
route.RouteHandler = new MyHttpControllerRouteHandler();
感謝をテストしました。非常に役立ちます。私はRESTに反対していませんが、私は各apiの要求に対してデータベースのトリップを保存したかったのです。私たちは、apiドメインに関連付けられた一意のidを持っています。これは、各apiリクエストのデータベース呼び出しに渡す必要があるリクエストです。私がセッションを使用しない場合、私はそれぞれのAPIリクエストに対して同じロジックを繰り返すことになります。 BTWには私がasp.netで持っているPreRequestHandlerExecuteに似たオーバーライドができ、各apiリクエストで取得したいセッションのデータを格納する方法がありますか? – user1186065
コントローラはこのように単体テストを行うのが難しくなります。コントローラコンストラクタでHttpContextBase(またはHttpSessionStateBase)引数を追加し、DIを使用してアプリケーションの新しいHttpContextWrapper(HttpContext.Current)に解決します。ユニットテストでは、それを嘲笑することができます。 –
@Filipが言っているように、このパスに従わないでください(ステートレスであるはずのWeb APIにセッションを追加する)。しかし、同じFilipはWeb API Cachingについての良い記事を持っています:http://goo.gl/2rnfI 私はgitHubで彼をフォークし、ソースコードにいくつかの機能を追加しました。 http://goo.gl/oW4hX 注:私はまだコードを改良しており、セキュリティ侵害の可能性があるかどうかテストしています。 – Tohid