69

すべてのAPIリクエストで取得する必要のある情報をセッション(またはASP.NET Web APIのすべて)に格納する必要があります。1つのAPIIISWebサイトがあり、ホストヘッダーを介して複数のWebサイトバインディングが追加されます。api.xyz.comなどのリクエストが届くと、ホストヘッダーがチェックされ、そのWebサイト情報がセッションに保存されます。この情報は、データベースを呼び出すときに後続の各apiリクエストで使用されます。

ASP.NETWebAPIではセッションがサポートされていないことを知っています。このような状況に対処する他の方法はありますか?後続の各リクエストで取得できる情報はどこに保存できますか?

ありがとう。

4

5 に答える 5

112

Global.asaxに追加

public override void Init()
{
    this.PostAuthenticateRequest += MvcApplication_PostAuthenticateRequest;
    base.Init();
}

void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
{
    System.Web.HttpContext.Current.SetSessionStateBehavior(
        SessionStateBehavior.Required);
}

試してみます ;)

于 2013-02-23T08:35:03.050 に答える
89

さて、RESTは設計上ステートレスです。セッション(またはそのようなもの)を追加することで、セッションをステートフルにし、RESTfulAPIを使用するという目的を打ち破ることになります。

RESTfulサービスの全体的な考え方は、ハイパーメディアリンクで使用するためのユニバーサル構文を使用してすべてのリソースを一意にアドレス指定でき各HTTPリクエストは、受信者がHTTPのステートレスな性質と完全に調和するように処理するのに十分な情報をそれ自体で伝送する必要があるということです。」

したがって、ここでWeb APIを使用して実行しようとしていることはすべて、RESTfulAPIが必要な場合は再構築する必要があります。

そうは言っても、それでもそのルートを進んでいくつもりなら、Web APIにセッションを追加するハッキーな方法があり、Imranによってここに投稿されていますhttp://forums.asp.net/t/1780385.aspx/ 1

コード(私はそれを本当にお勧めしませんが):

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;
    }
}

次に、HttpControllerHandlerをAPIルートに追加します。

route.RouteHandler = new MyHttpControllerRouteHandler();
于 2012-07-13T22:09:55.217 に答える
33

WebApi 2では、これをglobal.asaxに追加できます。

protected void Application_PostAuthorizeRequest() 
{
    System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}

次に、次の方法でセッションにアクセスできます。

HttpContext.Current.Session
于 2014-09-22T12:40:30.290 に答える
3

データが十分に小さく、セキュリティ上の懸念がない場合は、Cookieを使用できます。同じHttpContext.Currentベースのアプローチが機能するはずです。

要求と応答のHTTPヘッダーを使用して、サービス呼び出し間で情報を渡すこともできます。

于 2012-10-05T19:10:47.693 に答える
2

2017年にASP.NetCoreを使用すると、ここで説明されているように実行できます。

Microsoft.AspNetCore.Sessionパッケージは、セッション状態を管理するためのミドルウェアを提供します。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
  // Adds a default in-memory implementation of IDistributedCache.
    services.AddDistributedMemoryCache();

    services.AddSession(options =>
    {
        // Set a short timeout for easy testing.
        options.IdleTimeout = TimeSpan.FromSeconds(10);
        options.Cookie.HttpOnly = true;
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSession();
}

ドキュメントから:ASP.NETCoreの セッションとアプリケーションの状態の概要

作業中のプロジェクトですでにテスト済み

于 2017-07-18T20:38:17.240 に答える