小编Sch*_*ich的帖子

OData $ expand,DTO和Entity Framework

我有一个基本的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)

c# entity-framework odata asp.net-web-api

16
推荐指数
1
解决办法
1万
查看次数

ASP.NET请求和.NET 4.5 - 奇怪的行为

将产品升级到.NET 4.5后,我们在网站上遇到了一些奇怪的行为.我会尝试尽可能具体,但问题很模糊,所以请耐心等待.此外,对于这种情况,假设没有遵循最佳实践.

用户来到一个页面,该页面以异步方式向Web服务进行多次jquery ajax调用.由于此页面上的设计/编码较差,可能需要永久加载,但它确实提供了用户需要访问的子菜单.页面开始加载后,单击其中一个菜单选项转到另一个页面.到目前为止没什么特别的.

当我们在只安装了.NET 4.0的盒子上使用perfmon时,我们可以看到ASP.NET请求上下移动,正如您所期望的那样:

在4.0盒子上的Perfmon

当我们将它安装在安装了.NET 4.5的盒子上时,我们得到: 在此输入图像描述

执行上述工作流程后,请求挂断.没有排队; 他们只是坐在那里

经过进一步的研究,我们注意到两个不同页面之间的点击不仅仅是一个简单的href,而且实际上是在使用Response.Redirect(url);

此外,这仅在使用IE时发生.使用Firefox和Chrome时,这不是问题.

以下是我们迄今为止所尝试的内容:

  1. 我们联系了M $并将它们发送出DebugDiag转储.还在等.
  2. 我已经去了IIS,设置网站来跟踪失败的请求,并设置了一个失败的请求过滤器来给我一切.一旦站点锁定,我清除日志,然后检查站点锁定后的内容.每次它都在AspNetSessionDataBegin和AspNetSessionDataEnd事件之间挂起.
  3. 我们确实有一个读取/写入会话的HttpHandler,并且禁用它确实似乎解决了大部分问题,但没有解释为什么.
  4. jquery的onunload处理程序,它应该清理并中止所有剩余的xmlhttp请求,似乎没有经常执行.
  5. 安装这个补丁,仍然没有帮助.
  6. 我们目前正在将此导航逻辑中的Response.Redirect(url)方法更改为Response.Redirect(url,false); (往上看).

同样根据要求,这里是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)

asp.net iis jquery xmlhttprequest .net-4.5

9
推荐指数
1
解决办法
1866
查看次数

"无法支持查询"控制器错误

我正在通过以下答案找到: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,它显然工作得很好. …

c# odata asp.net-mvc-4 asp.net-web-api

2
推荐指数
1
解决办法
481
查看次数