如何在asp.net mvc 4中的apicontroller中使用session

时间:2015-08-19 12:39:11

标签: c# jquery asp.net asp.net-mvc asp.net-mvc-4

我正在使用asp.net mvc 4处理应用程序。在这里,我想使用JQuery使用自动完成扩展程序,我希望填充存储在会话中的CityID的所有位置。

以下是创建会话的功能:

public string Create(string City)
{
    try
    {
        //HttpSessionStateBase Session["c"]=City;
        //HttpContext.Current.Session["City"] = City;
        System.Web.HttpContext.Current.Session["City"] = City;
        long CityID = Convert.ToInt64(System.Web.HttpContext.Current.Session["City"].ToString());

        return City;
    }
    catch (Exception ex)
    {
       throw (ex);
    }
}

当用户从城市dropdownlist选择任何城市时,系统会调用此功能。

我的JQuery号码要求自动填充扩展程序为:

<script type="text/javascript">
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "ProductApi" })';
$('#txtLocation').autocomplete({
    source: function (request, response) {
        alert(url);
        $.ajax({
            url: url,
            data: { query: request.term },
            dataType: 'json',
            type: 'GET',
            success: function (data) {
                response($.map(data, function (item) {
                    return {
                        label: item.Name
                        //value: item.ID
                    }
                }));
            }
        })
    },
    select: function (event, ui) {
        $('#txtLocation').val(ui.item.label);
        //$('#ID').val(ui.item.value);
        return false;
    },
    minLength: 1
});

我的api控制器是:

public class ProductApiController : ApiController
{
    SqlConnection cnn = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["SQLCONN"].ToString());        

    [HttpGet]
    public IEnumerable<Search> GetProducts(string query = "")
    {
        cnn.Open();
        //string gid = GETSession("t");

        long CityID = Convert.ToInt64(System.Web.HttpContext.Current.Session["City"].ToString());

        SqlCommand cmd = new SqlCommand("Check_PrefixText", cnn);
        cmd.Parameters.AddWithValue("City", CityID);
        cmd.Parameters.AddWithValue("@Prefix", query);

        cmd.CommandType = CommandType.StoredProcedure;

        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);

        //var result = IEnumerable<City>(query);
        Search obj = new Search();
        cnn.Close();
        return dt.AsEnumerable().Select(row =>
        {
            return new Search
            {
                Name = Convert.ToString(row["Name"]),
            };
        });
    }
}

Global.asax档案中,我写了两种方法:

protected void Application_PostAuthorizeRequest()
{
    if (IsWebApiRequest())
    {
        HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
    }
}

private bool IsWebApiRequest()
{
    return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative);
}

webApiConfig课程中,我写了如下:

public static string UrlPrefix { get { return "api"; } }
public static string UrlPrefixRelative { get { return "~/api"; } }

public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{id}",
         defaults: new { id = RouteParameter.Optional }
    );
}

session["City"]ApiController的值仍为 null ,而session["City"]中存储了值。

3 个答案:

答案 0 :(得分:2)

将您的API更改为:

[HttpGet]
public IEnumerable<Search> GetProducts(long cityID, string query = "")
{

然后使用数据

传递cityID
data: { 
    cityID: $("#cityDropDownId :selected").val(),
    query: request.term 
},

忘记尝试使用“会话” - 这不是您正在尝试做的正确技术。

答案 1 :(得分:1)

简单地说,你不能。 Web Api遵循REST,其中包括无状态。这意味着没有会话。每个符合REST的请求必须包含请求本身中请求所需的所有数据(作为GET中的查询字符串或POST,PUT中的主体等的一部分)。

也就是说,常规的MVC控制器操作也可以返回JSON,XML等,因此您可以在MVC控制器中为您的AJAX请求设置端点,并从那里触摸会话。你不能从ApiController开始。

答案 2 :(得分:1)

使用SetSessionStateBehavior即可解决此问题。让我解释一下。

<强>的Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
{
    ...

    protected void Application_PostAuthorizeRequest()
    {
        if (IsWebApiRequest())
        {
            HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
        }
    }

    private bool IsWebApiRequest()
    {
        return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative);
    }

}

使用global.asax.csSetSessionStateBehavior中记下这两种方法,您可以访问ApiController中的会话