我有一个基本的WebApi服务设置,数据库首先设置EF DataModel.我正在运行WebApi,EF6和WebApi OData包的每晚构建.(WebApi:5.1.0-alpha1,EF:6.1.0-alpha1,WebApi OData:5.1.0-alpha1)
该数据库有两个表:产品和供应商.产品可以有一个供应商.供应商可以拥有多种产品.
我还创建了两个DTO类:
public class Supplier
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual IQueryable<Product> Products { get; set; }
}
public class Product
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我已按如下方式设置了我的WebApiConfig:
public static void Register(HttpConfiguration config)
{
ODataConventionModelBuilder oDataModelBuilder = new ODataConventionModelBuilder();
oDataModelBuilder.EntitySet<Product>("product");
oDataModelBuilder.EntitySet<Supplier>("supplier");
config.Routes.MapODataRoute(routeName: "oData",
routePrefix: "odata",
model: oDataModelBuilder.GetEdmModel());
}
Run Code Online (Sandbox Code Playgroud)
我按如下方式设置了两个控制器:
public class ProductController : …
Run Code Online (Sandbox Code Playgroud) 将产品升级到.NET 4.5后,我们在网站上遇到了一些奇怪的行为.我会尝试尽可能具体,但问题很模糊,所以请耐心等待.此外,对于这种情况,假设没有遵循最佳实践.
用户来到一个页面,该页面以异步方式向Web服务进行多次jquery ajax调用.由于此页面上的设计/编码较差,可能需要永久加载,但它确实提供了用户需要访问的子菜单.页面开始加载后,单击其中一个菜单选项转到另一个页面.到目前为止没什么特别的.
当我们在只安装了.NET 4.0的盒子上使用perfmon时,我们可以看到ASP.NET请求上下移动,正如您所期望的那样:
当我们将它安装在安装了.NET 4.5的盒子上时,我们得到:
执行上述工作流程后,请求挂断.没有排队; 他们只是坐在那里
经过进一步的研究,我们注意到两个不同页面之间的点击不仅仅是一个简单的href,而且实际上是在使用Response.Redirect(url);
此外,这仅在使用IE时发生.使用Firefox和Chrome时,这不是问题.
以下是我们迄今为止所尝试的内容:
同样根据要求,这里是HttpHandler代码:
public class KeepSessionAliveHttpHandler : IHttpHandler, IRequiresSessionState
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
if (context.Session.IsNewSession)
{
string redirectUrl = context.Request.Url.AbsoluteUri.Replace(context.Request.Url.AbsolutePath, VirtualPathUtility.ToAbsolute(Constant.Page_Logout));
context.Response.Clear();
context.Response.ContentType = "application/json; charset=utf-8";
context.Response.Flush();
context.Response.Write("{\"IsSessionAlive\": \"false\", \"RedirectUrl\": \"" + redirectUrl + "\"}");
}
else
{
context.Session["KeepSessionAlive"] = TimeZoneHelper.GetCurrentUtcDateTime();
context.Response.Clear();
context.Response.ContentType = "application/json; charset=utf-8";
context.Response.Flush(); …
Run Code Online (Sandbox Code Playgroud) 我正在通过以下答案找到:Web API OData Inlinecount无法正常工作
这是我的控制器,提供了一些虚拟数据.
[Queryable]
public class ValuesController : ApiController
{
// GET api/values
public PageResult<Category> Get(ODataQueryOptions<Category> queryOptions)
{
var returnValue = new List<Category>()
{
new Category() { Id = 1, Name= "Category 1"},
new Category() { Id = 2, Name= "Category 2"},
new Category() { Id = 3, Name= "Category 3"},
};
IQueryable results = queryOptions.ApplyTo(returnValue.AsQueryable());
return new PageResult<Category>(results as IEnumerable<Category>,
Request.GetNextPageLink(), Request.GetInlineCount());
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试通过Fiddler获取时,我收到以下错误:
"操作'获取'控制器'值',返回类型为'System.Web.Http.OData.PageResult`1 [[ODataTest_Solution.DTO.Category,ODataTest Solution,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null ]]'不支持查询.确保返回内容的类型是IEnumerable,IQueryable或任一接口的通用形式."
如果我改变方法它返回IQueryable,它显然工作得很好. …