标签: wcf-data-services

ADO.NET DataService:将参数传递给[WebInvoke]方法

考虑以下示例:

public class SomeBusinessLayerService : DataService<MyEntityContainer>
{
 [WebInvoke]
 void DoSomething(string someParam)
 {
 }
}
Run Code Online (Sandbox Code Playgroud)

我找不到关于如何将参数传递给函数的示例或任何帮助!使用WebClient(或使用fiddler goofinfg)我可以触发函数调用,但无论我尝试参数someParam总是为null更糟糕的是 - 如果我将类型更改为int - 我的所有尝试都会以下列错误结束:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  <code></code>
  <message xml:lang="en-US">Bad Request - Error in query syntax.</message>
</error>
Run Code Online (Sandbox Code Playgroud)

任何人都可以请求帮助我的POST内容的工作示例如何我可以调用它?

注意:这是DataService,而不是WCF服务.我可以使用相同的方法使用WCF服务,没有任何问题.

编辑:我也需要POST的例子,而不是在URI中嵌入参数,因为URI有大小限制和清理字符串的要求.

wcf-data-services

4
推荐指数
1
解决办法
6497
查看次数

在Silverlight中的ADO.Net Data Services中批量加载属性

我在Silverlight 3中使用ADO.Net数据服务(Astoria),我希望在初始加载之后延迟加载实体的属性.但是,当我准备加载它们时,我想将加载请求一起批处理.

// this is what I want to avoid
var c = (from c in ctx.Customers.Expand("Address,Phone,Email")
         where c.Id = 12
         select c).Take(1) as DataServiceQuery<Customer>;
Run Code Online (Sandbox Code Playgroud)

我到目前为止:

// I can do this instead
var c = (from c in ctx.Customers // .Expand("Address,Phone,Email")
         where c.Id = 12
         select c).Take(1) as DataServiceQuery<Customer>;
c.BeginExecute(CustomerCallback, objState);

...

// Later, when I want properties, I need to do this
ctx.BeginLoadProperty(c, "Address", AddressCallback, objState);
ctx.BeginLoadProperty(c, "Phone", PhoneCallback, objState);
ctx.BeginLoadProperty(c, "Email", EmailCallback, objState);
Run Code Online (Sandbox Code Playgroud)

但是,我无法想象如何获取DataServiceRequest对象以将load属性请求传递给BeginExecuteBatch.是否可以通过获取DataServiceQuery在同一批次中发出这些请求(以及可能与客户属性加载无关的其他请求)?

像这样的东西:

// c is …
Run Code Online (Sandbox Code Playgroud)

entity-framework silverlight-3.0 wcf-data-services

4
推荐指数
1
解决办法
828
查看次数

为什么使用"RIA Services Link"而不仅仅是OData端点?

在阅读之前,请知道我已阅读有关vanilla WCF,WCF数据服务和RIA服务之间差异的所有其他帖子.我的问题具体是为什么RIA Services被认为是专门针对Silverlight的一种特殊数据源,因为它似乎更有意义让它完成一项工作:充当REST接口背后的业务逻辑层.

看起来随着VS2010的发布,RIA Services巩固了其作为REST数据访问服务背后的业务逻辑层的立场 - 这似乎可以通过域服务类模板中的新"Expose OData Endpoint"选项得到证实. Visual Studio,据我所知,它本质上为你的RIA服务确实为WCFDS为任意数据源做了什么(我相信你可以做到这一点,我相信,但是这个复选框的添加清楚表明RIA服务可以是被视为包含业务逻辑的层,用于增强REST数据端点和/或将其约束到给定的查询集,而不一定是其自身的端点.

所以,如果我有一个业务逻辑的RIA服务,通过OData公开,我可以从WCF客户端应用程序添加对OData服务的引用.在客户端上,我获得了一个DataServiceContext派生物,它允许我在客户端上进行工作单元样式工作.我可以从Silverlight应用程序做同样的事情并获得看似相同的东西 - 一个DataServiceContext衍生物.

如果我在我的Silverlight应用程序中使用"RIA服务链接"直接将应用程序绑定到RIA服务而不是添加服务引用,我会获得Visual Studio生成的代码,它似乎支持几乎相同的工作模式,但是使用不同风格的API.

既然如此:

  • "RIA服务链接"的优点是什么,其中Silverlight应用程序直接绑定到RIA服务,而不是仅将服务引用添加到任何类型的客户端可以使用而不会引起紧密耦合的OData端点?我被告知RIA的神奇之处在于代码生成,所以我想我正在努力理解RIA代码生成与"添加服务引用"代码生成的区别.
  • 如果有优势,为什么这些优势专门针对Silverlight而非WCF客户端应用程序提供?将RIA服务纯粹作为OData端点背后的层来销售似乎有助于标准化和推动OData进一步成为任何类型客户端的通用类型端点 - "从ASP消耗,从Silverlight消耗,从WCF消耗......你获得了几乎相同的体验,而且它是一个很棒的体验."相反,我们将Silverlight与RIA直接绑定,具有一组特殊功能,以及所有其他使用开放协议的客户端.

silverlight wcf-data-services silverlight-4.0 wcf-ria-services

4
推荐指数
1
解决办法
1833
查看次数

如何通过WCF数据服务公开TimeSpan?

我正在为我的约会数据库创建一个WCF数据服务.

我将约会存储为DateTime,其持续时间为TimeSpan.当我尝试访问我的数据服务时,出现以下错误:

"服务器在处理请求时遇到错误.异常消息是''约会'类型的属性'持续时间'是'时间'类型,它不是受支持的基本类型.'.有关详细信息,请参阅服务器日志."

知道如何表示持续时间并通过我的WCF数据服务访问它吗?

.net wcf entity-framework wcf-data-services

4
推荐指数
1
解决办法
3043
查看次数

无法找到WCF数据服务类型

我正在尝试将WCF数据服务从VS2010内部托​​管移动到开发Web服务器.当我将代码移动到IIS7应用程序时,我收到此错误:

无法找到类型'Aaa.Bbb.Services.ZzzEntities',作为ServiceHost指令中的Service属性值提供,或者在配置元素system.serviceModel/serviceHostingEnvironment/serviceActivations中提供.

ZzzEntities.svc

<%@ ServiceHost
    Language = "C#"
    Factory = "System.Data.Services.DataServiceHostFactory,
               System.Data.Services, Version=4.0.0.0, Culture=neutral,
               PublicKeyToken=b77a5c561934e089"
    Service = "Aaa.Bbb.Services.ZzzEntities" %>
Run Code Online (Sandbox Code Playgroud)

ZzzEntities.svc.cs

using Aaa.Bbb.Domain.Entities;
using System.Data.Services;
using System.Data.Services.Common;
using System.ServiceModel.Web;

namespace Aaa.Bbb.Services {
    public class ZzzEntities:DataService<Domain.EntityFramework.Context> {
        public static void InitializeService(DataServiceConfiguration config) {
            config.UseVerboseErrors = true;

            config.SetEntitySetAccessRule("*", EntitySetRights.All);
            config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);

            config.DataServiceBehavior.MaxProtocolVersion =
                DataServiceProtocolVersion.V3;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:此外,Aaa.Bbb.Services.dll编译并在IIS7 Web应用程序的\ bin目录中.

编辑:按照这里的说明我尝试创建一个实例ZzzEntities- System.TypeLoadException 时出现以下错误:无法从程序集'Aaa.Bbb.Services,Version = 1.0.0.0,Culture = neutral,PublicKeyToken加载类型'ZzzEntities' = NULL.

使用.NET Reflector我可以清楚地看到Aaa.Bbb.Services.dll包含一个名为的类,ZzzEntities所以我真的很遗憾为什么我的类型无法创建.

c# wcf iis-7 wcf-data-services

4
推荐指数
1
解决办法
4795
查看次数

如何在WCF DataService中接受JSON?

我试图了解如何使用WCF数据服务(基于EF 4.1)来创建一个宁静的Web服务,该服务将持久化作为JSON对象传递的实体.

我已经能够创建一个方法,可以接受带有一组原始数据类型作为参数的GET请求.我不喜欢这个解决方案,我更喜欢在http请求体中发送带有JSON对象的POST请求.

我发现我无法让框架将json序列化为一个对象,但是我可以手动完成它.

我的问题是我似乎无法读取POST请求的正文 - 正文应该是JSON有效负载.

下面是一个粗略的裂缝.我已经尝试了几次不同的迭代,似乎无法从请求体中获取原始JSON.

有什么想法吗?更好的方法吗?我只想发布一些JSON数据并进行处理.

    [WebInvoke(Method = "POST")]
    public void SaveMyObj()
    {
        StreamReader r = new StreamReader(HttpContext.Current.Request.InputStream);
        string jsonBody = r.ReadToEnd();  // jsonBody is empty!!

        JavaScriptSerializer jss = new JavaScriptSerializer();
        MyObj o = (MyObj)jss.Deserialize(jsonBody, typeof(MyObj));

        // Now do validation, business logic, and persist my object
    }
Run Code Online (Sandbox Code Playgroud)

我的DataService是一个扩展的实体框架DataService

System.Data.Services.DataService<T>
Run Code Online (Sandbox Code Playgroud)

如果我尝试将非原始值作为参数添加到方法中,我会在跟踪日志中看到以下异常:

System.InvalidOperationException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
'Void SaveMyObj(MyNamespace.MyObj)' has a parameter 'MyNamespace.MyObj o' of type 'MyNamespace.MyObj' which is not supported for service operations. Only primitive types are supported …
Run Code Online (Sandbox Code Playgroud)

c# json wcf-data-services ef4-code-only

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

WCF数据服务还是只是WCF服务?

我想决定走哪条路.我有一个解决方案,需要一个Web服务和一个客户端,这是一个Windows Phone 7项目.WP7项目需要通过WCF服务与数据库通信.

关于我应该选择哪种方式,以及常规WCF服务文件VS WCF数据服务的区别,优点/缺点,我有点困惑.考虑到我的wp7应用程序需要在数据库上的某些表上运行查询,哪种方式会更容易.

任何解释都会受到欢迎.谢谢

asp.net wcf wcf-data-services windows-phone-7

4
推荐指数
1
解决办法
3067
查看次数

为什么我的oData响应没有导航属性

如果您查看以下示例oData Feed,您将看到包含"子"项的导航属性,以告诉您要遵循的URL:

http://services.odata.org/OData/OData.svc/Suppliers?$format=json

例如,供应商0具有产品的导航属性.这链接到该供应商的产品列表.

http://services.odata.org/OData/OData.svc/Suppliers(0)/Products?$format=json


我正在努力做同样的事情ODataConventionModelBuilder,EntitySetController<Product>所以当我要求oData/Product(0)它时会告诉我产品的'功能':

我像这样创建我的模型(基于GetImplicitEdmModel示例)

     // odata
     ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
     modelBuilder.EntitySet<RRStoreDB.Models.Product>("Product");
     modelBuilder.EntitySet<RRStoreDB.Models.ProductFeature>("ProductFeature");

     Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel();
     config.Routes.MapODataRoute("ODataRoute", "odata", model);
Run Code Online (Sandbox Code Playgroud)

我为WebAPI创建了一个控制器:

public class  ProductController : EntitySetController<Product, int>
{
    RRStoreDBContext _db = new RRStoreDBContext();


    [Queryable]
    public override IQueryable<DProduct> Get()
    {
        return _db.Products.AsQueryable();
    }

    public ICollection<ProductFeature> GetProductFeatures(int key)
    {
        Product product = _db.Products.FirstOrDefault(p => p.ProductId == key);
        if (product == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        return product.ProductFeatures;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我实际调用我的子属性的URL时,它工作并给我正确的功能列表: …

wcf-data-services odata asp.net-web-api

4
推荐指数
1
解决办法
5843
查看次数

来自wcf数据服务的实体框架6数据上下文

我曾经在wcf数据服务服务操作中访问我的(ef 5.0)实体的数据上下文this.CurrentDataSource.MyEntity.我的数据服务继承自DataService<T>.现在我想使用实体框架6.0并在互联网上阅读,我应该继承服务EntityFrameworkDataService<T>.但是现在从我的服务操作中,我再也无法访问我的数据上下文了.this.CurrentDataSource不包含对实体的任何引用.

c# entity-framework wcf-data-services objectcontext

4
推荐指数
1
解决办法
2945
查看次数

操作而不是查询拦截器(WCF数据服务)

我正在阅读有关查询拦截器的内容.我很失望,因为那更像是过滤器而不是拦截器.换句话说,您可以收集包含记录或不包括它们.例如,您无法修改记录.

如果我想为我的实体创建一个查询拦截器,我Users可以这样做:

[QueryInterceptor("Users")] // apply to table users
public Expression<Func<User, bool>> UsersOnRead()
{
    return cust => cust.IsDeleted == false;
}
Run Code Online (Sandbox Code Playgroud)

如果我改为创建操作怎么办: 注意非常重要的是操作名称只有实体名称,否则它将无法工作

[WebGet]
public IEnumerable<User> Users()
{                    
    return this.CurrentDataSource.Users.Where(x=>x.IsDeleted==false);
}
Run Code Online (Sandbox Code Playgroud)

放置此方法而不是查询拦截器使我的服务行为完全相同.另外,我有更多的力量!采用这种方法是更好的解决方案吗?

c# security wcf-data-services queryinterceptor

4
推荐指数
1
解决办法
680
查看次数