【问题标题】:WCF Data Service gives 404 when making OData requests for derived typesWCF 数据服务在为派生类型发出 OData 请求时给出 404
【发布时间】:2013-05-28 10:45:53
【问题描述】:

我认为我错过了让 WCF 数据服务/OData/Inheritance 正常工作的技巧;我创建了几个简单的表格:

create table Super 
(
superID int IDENTITY(1,1) not null PRIMARY KEY, 
supername nvarchar(55),
)


create table sub
(
superID int not null,
extraData nvarchar(100),
FOREIGN KEY (superID) REFERENCES Super(superID)
)


insert Super values('abc')
insert Super values('def')
insert Super values('ghi')
insert Super values('jkl')
insert Super values('mno')


insert sub values(1, 'pqrstu')
insert sub values(3, 'vwxyz')

将它们拉入 edmx,将自动创建的关系替换为继承关系,从而生成:

namespace WebApplication3
{
#region Contexts

public partial class Entities : ObjectContext
    {        ....    }

#endregion

#region Entities

[EdmEntityTypeAttribute(NamespaceName="Model", Name="sub")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class sub : Super
    {
    #region Factory Method
    ...
    #endregion
    #region Primitive Properties

    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
    [DataMemberAttribute()]
    public global::System.String extraData
    ...

    #endregion

    }


[EdmEntityTypeAttribute(NamespaceName="Model", Name="Super")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
[KnownTypeAttribute(typeof(sub))]
public partial class Super : EntityObject
    {
    #region Factory Method
    ...

    #endregion
    #region Primitive Properties


    [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.Int32 superID
    ...


    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
    [DataMemberAttribute()]
    public global::System.String supername
    ...

    #endregion

    }

#endregion

}

设置服务以使用 V3:

namespace WebApplication3
    {
    public class WcfDs : DataService<Entities>
        {
        public static void InitializeService(DataServiceConfiguration config)
            {
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
            }
        }
    }

查询 Supers 工作正常:

http://localhost:8384/WcfDs.svc/Supers

我尝试了许多 URL,但徒劳地尝试获取派生类型:

http://localhost:8384/WcfDs.svc/Supers/Model.sub/
http://localhost:8384/WcfDs.svc/Supers(1)/Model.sub/
http://localhost:8384/WcfDs.svc/Supers/WebApplication3.sub/
http://localhost:8384/WcfDs.svc/Supers(1)/WebApplication3.sub/
....

但我总是收到 404 Resource not found 响应。我错过了什么?

【问题讨论】:

  • 所以,/Supers(1) 有效(并且属于sub 类型),但/Supers(1)/&lt;type-name&gt; 无效?在您得到/Supers(1) 的结果中,假设它是ATOM,应该有一个名为category 的xml 元素。 category 元素的 term 名称的值是多少?该值应该是实体的完整类型名称。比如http://services.odata.org/v3/OData/OData.svc/Products(0),可以看到类型名称是ODataDemo.Product
  • 正确,/Supers(1) 有效,/Supers(1)/Model.sub 无效。 /supers(1) 的类别元素是:schemas.microsoft.com/ado/2007/08/dataservices/scheme" />

标签: inheritance wcf-data-services odata


【解决方案1】:

诀窍是:

在项目属性中从使用 Visual Studio 开发服务器切换到使用本地 IIS。

至少,这在我的 VS 2010 环境中有效。

【讨论】:

  • 是的 - 可以这样做 :-) VS 开发服务器存在包含点字符的 URL 的问题。它将有效地返回 404 或 400,而不需要 WCF DS 处理 URL。使用本地 IIS 或 Express IIS 可以解决这个问题(正如您刚刚发现的那样)。抱歉,我之前没有意识到这可能会发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多