标签: wcf-data-services

WCF数据服务的客户端通道工厂

我讨厌使用服务引用有很多不同的原因,而是使用接口和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

wcf-data-services

5
推荐指数
0
解决办法
717
查看次数

WCF数据服务或实体框架

我必须开发一个应用程序来在DB中存储一些平面文件.控制台应用程序和SQL Server将在同一台机器上,这两个选项中哪一个最好?

  • 创建WCF数据服务并从控制台应用程序中使用它
  • 直接使用控制台应用程序中的Entity Framework实体

通常,何时使用WCF数据服务或实体框架更好?

谢谢!

wcf entity-framework wcf-data-services

5
推荐指数
1
解决办法
2457
查看次数

实体框架,多个edmx共享连接字符串-有可能吗?

我看到了许多相关的问题,但这些问题都不是我要找的。

我们正在使用一个数据库,并且需要使用不同的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

5
推荐指数
1
解决办法
3127
查看次数

如何使用WCF数据服务/ OData从sproc中使用复杂对象?

使用WCF数据服务(和最新的实体框架),我想从存储过程返回数据.返回的sproc字段与我的数据库中的任何实体都不匹配1:1,因此我在edmx模型中为它​​创建了一个新的复杂类型(而不是附加现有实体):

  1. 右键单击*.edmx模型/添加/功能导入
  2. 选择sproc(返回三个字段) - GetData
  3. 单击获取列信息
  4. 添加函数导入名称:GetData
  5. 单击"创建新的复杂类型 - GetData_Result"

在服务中,我定义:

    [WebGet]
    public List<GetData_Result> GetDataSproc()
    {
        PrimaryDBContext context = new PrimaryDBContext();
        return context.GetData().ToList();
    }
Run Code Online (Sandbox Code Playgroud)

我创建了一个快速控制台应用程序来测试,并在运行后添加了对 - System.Data.ServicesSystem.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)

entity-framework wcf-data-services c#-4.0

5
推荐指数
1
解决办法
3354
查看次数

从实体框架中的表值函数创建集合

我有一个包含非常大的表的数据库(其中一些可能有超过1,000,000条记录),并且该数据库的每个用户都应该看到一些这样的数据,因此我们有多个获得用户ID的TVF(表值函数)并选择那些该用户可见的表的记录(此操作需要多个SELECT语句,我认为调用TVF远比在代码中实现它好得多).在我的客户程序的第一个版本中,我有一个类IQueryable,它具有使用LinqToSql实现的多个类型的属性,并且它工作得很好.现在我有一个客户端想要使用我的程序集来编写WCF数据服务,所以我必须编写一个派生自DbContext(使用EF)的类,可以在指定的服务中使用.我的问题是:

  • DbContext自动公开DbSet其中定义的所有属性,因此每个具有最低访问级别的用户都可以看到表的整个数据(当然客户端应用程序将限制数据,但客户端可以直接访问数据,甚至可以将这些数据导入到Excel或Access中的OData)

  • 我有多个类型的公共属性,IQueryable但它们不会出现在WCF数据服务公开的数据列表中.

为了解决这个问题,我认为最完整的解决方案是能够将TVF称为表并从中创建一个集合.但我不知道该怎么做?!

注意 对数据库的任何更改都需要一些日志记录,因此我有存储过程来执行这些更改,因此我只需要对我的WCF数据服务的只读访问权限,并且我不希望默认设置包含在表中发布的表的所有记录.服务

c# entity-framework wcf-data-services entity-framework-5

5
推荐指数
1
解决办法
1148
查看次数

WCF 中的 MaxReceivedMessageSize 错误

由于我是 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)

wcf wcf-binding wcf-security wcf-data-services

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

如何使用新的 jstree v3.0.0 按需加载子项

我正在寻找一些帮助在 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)

jquery json wcf-data-services jstree

5
推荐指数
1
解决办法
4782
查看次数

WebApi odata:将长序列化为字符串

我正在从 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 位数字反序列化为字符串值。这可能吗?

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

5
推荐指数
1
解决办法
1439
查看次数

生成OData客户端时忽略SSL错误

我正在尝试使用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)

ssl visual-studio wcf-data-services odata

5
推荐指数
1
解决办法
332
查看次数

使用Azure表存储的另一种方法?

我想将这样的实体用于表存储:

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需要

  1. 无参数构造函数
  2. 所有属性都是公共的,并且是读/写的。
  3. 从TableServiceEntity继承;

前两个是我不想做的两件事。我为什么要让任何人都可以更改一些只读数据?或以不一致的方式创建此类对象(那么.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

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