我讨厌使用服务引用有很多不同的原因,而是使用接口和System.ServiceModel.ChannelFactory
我希望能够在连接到WCF数据服务时使用类似的东西.
我的意思是当我创建DataService端点时,它只是DataService,为什么我不能在创建客户端时创建DataServiceContext并且可以访问MyDataService中的所有IQueryables.
例如
共同
public interface IMyDataService
{
public IQueryable<Foo> Foos {get;set;}
public IQueryable<OtherFoo> OtherFoos {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
服务器
public class MyDataService : IMyDataService
{
public IQueryable<Foo> Foos {get;set;}
public IQueryable<OtherFoo> OtherFoos {get;set;}
}
public class DataService : DataService<MyDataService>
{
}
Run Code Online (Sandbox Code Playgroud)
客户
var context = new DataServiceContext<IMyDataService>();
var foo = context.Foos.First(f=>f.Id = 5);
var otherFoos = contact.OtherFoos.Where(of=>of.width > 6);
Run Code Online (Sandbox Code Playgroud)
编辑:我有一个解决方案,我创建了一个IMyDataService的代理类,但是我的理解是,这在服务器上会很难.任何人都知道使用此处详述的方法创建代理对性能的影响:http://www.codeproject.com/KB/cs/dynamicproxy.aspx
我必须开发一个应用程序来在DB中存储一些平面文件.控制台应用程序和SQL Server将在同一台机器上,这两个选项中哪一个最好?
通常,何时使用WCF数据服务或实体框架更好?
谢谢!
我看到了许多相关的问题,但这些问题都不是我要找的。
我们正在使用一个数据库,并且需要使用不同的Model和ObjectContext类名称分离edmx文件。这导致具有多个连接字符串,仅在元数据部分不同。
现在我结束了:
Web.config
<connectionStrings configSource="connectionStrings.config"></connectionStrings>
Run Code Online (Sandbox Code Playgroud)
connectionStrings.config
<connectionStrings>
<add name="Entities" connectionString="metadata=res://*/Entity.Model.csdl|
res://*/Entity.Model.ssdl|res://*/Entity.Model.msl;
provider=CONNECTION STRING DATA GOES HERE"/>
<add name="TwoEntities" connectionString="metadata=res://*/TwoEntity.TwoModel.csdl|
res://*/TwoEntity.TwoModel.ssdl|res://*/TwoEntity.TwoModel.msl;
provider=EXACTLY THE SAME CONNECTION STRING DATA GOES HERE"/>
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
在我的ObjectContext派生类中,我确实具有默认生成的构造函数:
public Entities()
: base("name=Entities", "Entities")
{
}
Run Code Online (Sandbox Code Playgroud)
和
public TwoEntities()
: base("name=TwoEntities", "TwoEntities")
{
}
Run Code Online (Sandbox Code Playgroud)
最好不要在.config文件中有两个连接字符串,而是从该文件共享相同的连接字符串,并以某种方式在每个类中覆盖它的元数据部分。
有关如何执行此操作的任何建议?
wcf entity-framework connection-string edmx wcf-data-services
使用WCF数据服务(和最新的实体框架),我想从存储过程返回数据.返回的sproc字段与我的数据库中的任何实体都不匹配1:1,因此我在edmx模型中为它创建了一个新的复杂类型(而不是附加现有实体):
在服务中,我定义:
[WebGet]
public List<GetData_Result> GetDataSproc()
{
PrimaryDBContext context = new PrimaryDBContext();
return context.GetData().ToList();
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个快速控制台应用程序来测试,并在运行后添加了对 - System.Data.Services和System.Data.Services.Clientthis 的引用Install-Package EntityFramework -Pre,但库上的版本是4.0而不是5.x.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Services.Client;
using ConsoleApplication1.PrimaryDBService;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataServiceContext context = new DataServiceContext(new Uri("http://localhost:50100/PrimaryDataService1.svc/"));
IEnumerable<GetData_Result> result = context.Execute<GetData_Result>(new Uri("http://localhost:50100/PrimaryDataService1.svc/GetDataSproc"));
foreach (GetData_Result w in result)
{
Console.WriteLine(w.ID + "\t" + w.WHO_TYPE_NAME …Run Code Online (Sandbox Code Playgroud) 我有一个包含非常大的表的数据库(其中一些可能有超过1,000,000条记录),并且该数据库的每个用户都应该看到一些这样的数据,因此我们有多个获得用户ID的TVF(表值函数)并选择那些该用户可见的表的记录(此操作需要多个SELECT语句,我认为调用TVF远比在代码中实现它好得多).在我的客户程序的第一个版本中,我有一个类IQueryable,它具有使用LinqToSql实现的多个类型的属性,并且它工作得很好.现在我有一个客户端想要使用我的程序集来编写WCF数据服务,所以我必须编写一个派生自DbContext(使用EF)的类,可以在指定的服务中使用.我的问题是:
DbContext自动公开DbSet其中定义的所有属性,因此每个具有最低访问级别的用户都可以看到表的整个数据(当然客户端应用程序将限制数据,但客户端可以直接访问数据,甚至可以将这些数据导入到Excel或Access中的OData)
我有多个类型的公共属性,IQueryable但它们不会出现在WCF数据服务公开的数据列表中.
为了解决这个问题,我认为最完整的解决方案是能够将TVF称为表并从中创建一个集合.但我不知道该怎么做?!
注意 对数据库的任何更改都需要一些日志记录,因此我有存储过程来执行这些更改,因此我只需要对我的WCF数据服务的只读访问权限,并且我不希望默认设置包含在表中发布的表的所有记录.服务
由于我是 WCF 的新手,请帮助我。我收到此错误。我在互联网上搜索过这个问题,我有很多解决方案,但是当我应用这些解决方案时。我面临的一些新问题。所以请给我一个有效的解决方案。
已超出传入邮件的最大邮件大小配额 (65536)。要增加配额,请在适当的绑定元素上使用 MaxReceivedMessageSize 属性。
服务 Web.config 文件。
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="WSHttpBinding_IService1" maxBufferSize="2147483647"
maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="WcfServiceZone_Store.Service1" behaviorConfiguration="metadataBehavior">
<!-- Service Endpoints -->
<endpoint address="" binding="wsHttpBinding" contract="WcfServiceZone_Store.IService1">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metadataBehavior">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- …Run Code Online (Sandbox Code Playgroud) 我正在寻找一些帮助在 jstree 中按需(扩展)填充子节点。我可以填充父节点,但无法填充子节点。
我正在使用 jstree 来填充树中的节点。我的数据源是json。但是,我从不同的服务获取父节点,从不同的服务获取子节点。
我正在使用这里找到的 新 jstree 版本 3.0.0 :https: //github.com/vakata/jstree/zipball/3.0.0-beta8
我想在用户展开父节点时按需加载子节点。可能有数百家公司、数千个站点和数百万个代理,因此不可能一次加载所有数据...(即,将结果公司、站点和代理组合在一起可以工作,但由于性能问题而不可取)。
此处找到的代码示例: http: //www.jstree.com/docs/json/非常隐式,我只能使用提供的示例填充父节点。也许遇到类似解决方案的人可以帮助我找到合适的解决方案。
另外,我需要加载 3 层子级,想一个场景:
公司1 -站点1 --代理1 --代理2 -站点2 --代理3 --代理4
公司2 -站点3 --代理5 -站点4 --代理6 --代理7
这是我的代码(仅适用于父节点):
$('#agentsTreev2').jstree({
"plugins": ["contextmenu", "dnd", "search", "sort", "state", "types", "unique", "wholerow"],
'core': {
'data': {
'url': function (node) {
console.log(node.id);
return node.id === '#' ?
'http://localhost:21282/data.svc/Companies?$format=application/json;odata=nometadata;'
:
'http://localhost:21282/data.svc/Sites?$select=Site_Id,Name,Company_Id&$filter=Company_Id eq 24&$format=application/json;odata=nometadata;';
Run Code Online (Sandbox Code Playgroud)
//^^^^ 以上是子节点/站点的示例 url,实际 url 应使用父节点公司 ID
},
'crossDomain': 'true',
'type': 'GET', …Run Code Online (Sandbox Code Playgroud) 我正在从 WCF 数据服务迁移到 Web API odata v4。WCF 数据服务确实在引号中序列化了长值:
{
"value":[{
"ID":"4527895973896126465"
},{
"ID":"4527895973896126466"
}]
}
Run Code Online (Sandbox Code Playgroud)
Web API odata 不会:
{
"value":[{
"ID":4527895973896126465
},{
"ID":4527895973896126466
}]
}
Run Code Online (Sandbox Code Playgroud)
这意味着我在 JavaScript 中的 JSON.parse 期间失去了 64 位数字的精度,因为 JavaScript 数字只有 53 位。
WebApi 是否具有将长值作为字符串值处理的内置机制?我在考虑IEEE754Compatible标头元素。但这对生成的响应没有影响。我是否忽略了什么?
另一种解决方案是在客户端的 JSON.parse 期间将 64 位数字反序列化为字符串值。这可能吗?
我正在尝试使用Visual Studio为OData v4服务生成客户端代码.我的服务在没有DNS名称的服务器上运行,并且正在使用HTTPS的自签名证书.我的服务不适用于HTTP.
当我运行OData客户端代码生成器T4模板时,我在本文的底部得到了SSL错误.当我尝试通过"添加连接服务"上下文菜单添加服务时,出现错误,表示无法连接.
我认为VS没有连接到我的服务,因为SSL证书与URL的域名不匹配,因为服务器是通过IP地址而不是域名访问的.如果这是一个客户端程序,我可以编写自己的证书验证例程,覆盖现有的策略.但是,由于此代码在Visual Studio中运行,因此我无法访问运行时(我认为).
当然,我不是第一个反对这一点的人.当您的服务仅通过IP地址可用时,如何生成OData客户端?
详细错误:
Severity Code Description Project File Line Suppression State
Error Running transformation: System.Net.WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) …Run Code Online (Sandbox Code Playgroud) 我想将这样的实体用于表存储:
public class MyEntity
{
public String Text { get; private set; }
public Int32 SomeValue { get; private set; }
public MyEntity(String text, Int32 someValue)
{
Text = text;
SomeValue = someValue;
}
}
Run Code Online (Sandbox Code Playgroud)
但这是不可能的,因为ATS需要
前两个是我不想做的两件事。我为什么要让任何人都可以更改一些只读数据?或以不一致的方式创建此类对象(那么.ctor的含义是什么?),或者甚至更糟的是,更改PartitionKey或RowKey。为什么我们仍然受到这些反序列化要求的约束?
我不喜欢以这种方式开发软件,如何使用可以序列化和反序列化对象的方式使用表存储库?我认为只要对象从TableServiceEntity继承就不会有问题。
到目前为止,我必须保存一个对象,但是我不知道如何检索它:
Message m = new Message("message XXXXXXXXXXXXX");
CloudTableClient tableClient = account.CreateCloudTableClient();
tableClient.CreateTableIfNotExist("Messages");
TableServiceContext tcontext = new TableServiceContext(account.TableEndpoint.AbsoluteUri, account.Credentials);
var list = tableClient.ListTables().ToArray();
tcontext.AddObject("Messages", m);
tcontext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
有什么方法可以避免那些反序列化需求或获取原始对象?
干杯。
serialization azure wcf-data-services azure-table-storage deserialization
wcf ×3
odata ×2
azure ×1
c# ×1
c#-4.0 ×1
edmx ×1
javascript ×1
jquery ×1
json ×1
jstree ×1
ssl ×1
wcf-binding ×1
wcf-security ×1