考虑以下示例:
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有大小限制和清理字符串的要求.
我在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) 在阅读之前,请知道我已阅读有关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.
既然如此:
silverlight wcf-data-services silverlight-4.0 wcf-ria-services
我正在为我的约会数据库创建一个WCF数据服务.
我将约会存储为DateTime,其持续时间为TimeSpan.当我尝试访问我的数据服务时,出现以下错误:
"服务器在处理请求时遇到错误.异常消息是''约会'类型的属性'持续时间'是'时间'类型,它不是受支持的基本类型.'.有关详细信息,请参阅服务器日志."
知道如何表示持续时间并通过我的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所以我真的很遗憾为什么我的类型无法创建.
我试图了解如何使用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) 我想决定走哪条路.我有一个解决方案,需要一个Web服务和一个客户端,这是一个Windows Phone 7项目.WP7项目需要通过WCF服务与数据库通信.
关于我应该选择哪种方式,以及常规WCF服务文件VS WCF数据服务的区别,优点/缺点,我有点困惑.考虑到我的wp7应用程序需要在数据库上的某些表上运行查询,哪种方式会更容易.
任何解释都会受到欢迎.谢谢
如果您查看以下示例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数据服务服务操作中访问我的(ef 5.0)实体的数据上下文this.CurrentDataSource.MyEntity.我的数据服务继承自DataService<T>.现在我想使用实体框架6.0并在互联网上阅读,我应该继承服务EntityFrameworkDataService<T>.但是现在从我的服务操作中,我再也无法访问我的数据上下文了.this.CurrentDataSource不包含对实体的任何引用.
我正在阅读有关查询拦截器的内容.我很失望,因为那更像是过滤器而不是拦截器.换句话说,您可以收集包含记录或不包括它们.例如,您无法修改记录.
如果我想为我的实体创建一个查询拦截器,我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)
放置此方法而不是查询拦截器使我的服务行为完全相同.另外,我有更多的力量!采用这种方法是更好的解决方案吗?