【发布时间】:2017-09-18 04:16:12
【问题描述】:
你好,这里是第一个问题,如果有什么不合适的,请告诉我。
所以我们用 C# 和 Angular2 开发了这个 Web API。 其中一个功能需要会话高效,我浏览了许多主题和文章,我在这方面坚持了几天。
我像这样随便将我的对象存储在会话中:
if (HttpContext.Current.Session != null) HttpContext.Current.Session["Object"] = myNotNullVariable;
服务器端,使用 EnableCors 属性启用 cors(使用小丑 * 到处都会导致前面出现 cors 错误):
[EnableCors(origins: "http://localhost:4200,http://mywebapifronturl,http://mywebapibackurl",headers: "accept,content-type,origin,expires,cookie,authorization",methods: "*",exposedHeaders: "set-cookie",SupportsCredentials = true)]
[RoutePrefix("api/project")]
public class ProjectController : ApiController
这里是前端请求:
myGetFunctionWhichNeedsSession(): Observable<Array<ModelModel>>{
return this.http.get(environment.baseUrl + '/api/myController/myGetFunctionWhichNeedsSession/')
.map(res => res.json());
}
下面是我的 WebApiConfig:
public static string UrlPrefix { get { return "api"; } }
public static string UrlPrefixRelative { get { return "~/api"; } }
public static void Register(HttpConfiguration config)
{
// Configuration et services API Web
// Itinéraires de l'API Web
config.MapHttpAttributeRoutes();
config.EnableCors();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
然后是我的 Global.asax 的一部分:
protected void Application_PostAuthorizeRequest()
{
if (IsWebApiRequest())
{
HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}
}
private bool IsWebApiRequest()
{
return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative);
}
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
Session.Timeout = 10080;
}
最终是我的 Web.config 文件:
<system.web>
<sessionState mode="InProc" timeout="10080" />
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
<httpModules>
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
</httpModules>
</system.web>
当我使用 RestletClient 仅测试后端 API 时,这没问题,但是当我尝试使用我的前端 Angular 会话时,它不起作用。
【问题讨论】: