Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf 用于业务实体和业务逻辑的多租户服务API_Wcf - Fatal编程技术网

Wcf 用于业务实体和业务逻辑的多租户服务API

Wcf 用于业务实体和业务逻辑的多租户服务API,wcf,Wcf,我们有一个应用程序,希望在其中公开大量数据库实体和一些业务逻辑。每个实体都需要能够读取、添加和更新。在这一点上,我们不希望允许删除 我们构建的软件用于广泛的业务,其中包括多租户运营局服务,我们的一些客户出于财务原因使用这种方法来拥有单独的数据库 我们希望能够尽量减少需要维护的端点数量。目前只有3个表作为WCF接口公开,每个表都有6个附加方法。这是可以管理的,但如果操作有50个数据库,突然变成150个端点。更糟糕的是,如果我们公开了50个表,这些表变成了2500个端点 有人建议我们如何设计出一个简

我们有一个应用程序,希望在其中公开大量数据库实体和一些业务逻辑。每个实体都需要能够读取、添加和更新。在这一点上,我们不希望允许删除

我们构建的软件用于广泛的业务,其中包括多租户运营局服务,我们的一些客户出于财务原因使用这种方法来拥有单独的数据库

我们希望能够尽量减少需要维护的端点数量。目前只有3个表作为WCF接口公开,每个表都有6个附加方法。这是可以管理的,但如果操作有50个数据库,突然变成150个端点。更糟糕的是,如果我们公开了50个表,这些表变成了2500个端点

有人建议我们如何设计出一个简单的实体模型Job.add(var1)或iList jobs=Job.GetSelected(“sql类型读取”)的系统吗


如果没有所有这些端点,您似乎可以将“标识”传递给每个查询并将其考虑在内。这意味着“Job”表中的每个记录都需要引用所有者的“identity”,但这应该不是什么大问题


只要确保每个查询都验证了“标识”,您就可以了。

如果我正确理解您的问题,我认为您需要唯一的端点,但您可以拥有端点引用的单个服务行为

创建默认端点:

<behaviors>
  <serviceBehaviors>
    <behavior name="MyService.DefaultBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

设置默认绑定:

<bindings>
  <wsHttpBinding>

    <binding name="DefaultBinding">
      <security mode="None">
        <transport clientCredentialType="None"/>
      </security>
    </binding>

  </wsHttpBinding>
</bindings>

使所有服务引用点指向默认行为和绑定:

<service behaviorConfiguration="MyService.DefaultBehavior"
           name="MyService.Customer">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="DefaultBinding"
              contract="MyService.ICustomer">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>


每次添加服务时,它都是一个简单的配置条目。

提供多租户,没有大量的端点

一种方法是使用REST风格的WCF服务,该服务可以使用用户名/密码来区分您正在使用的客户端,从而能够在内部选择要连接到的DB。WCF为您提供了UriTemplate,允许您将URL的一部分映射到web方法中的参数:

  • HTTP GET请求:Id)
  • HTTP PUT请求:Id)/(字段1)/(字段2)
  • HTTP POST请求:Id)/(字段1)/(字段2)
  • HTTP删除请求:Id)
您还可以为更多任务添加其他Uri模板,例如:

  • HTTP GET请求:最近的项目数)
  • HTTP GET请求:Id)
谁在使用我的服务?

通过要求客户端提供用户名和密码,您可以将其映射到特定的数据库。然后,通过使用/{tableName}/{operation}/{params…}的UriTemplate,您可以使用web服务中的代码来执行给定表、操作和参数的DB过程

将其包装起来


您的web配置甚至不需要做太多更改。下面的web文章系列是了解REST样式web服务的好地方,我相信它符合您的需要:

对于Apache,您可以使用一组相当简单的URL重写规则,将任意一组DB表及其对应的端点映射到一个带有参数的端点

例如,要将$ROOT/table\u name/column\u name映射到$ROOT/index.php?tn=table\u name&cn=column\u name,可以向$ROOT/.htaccess添加如下规则:

RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/?$ index.php?tn=$1&cn=$2 [QSA,L]
然后您只需要维护$ROOT/index.php(当然,它可以为不存在的表和/或列生成适当的HTTP状态代码)。

允许您使用开放数据协议(OData)以RESTful方式公开数据。这正式称为ADO.Net数据服务,在此之前称为Astoria。可以公开任何IQueryable集合。大多数示例中显示的方法是使用实体框架,但是也有示例显示了NHibernate和其他数据访问技术的使用。OData是一种基于Atom Pub的自描述API,具有一些自定义扩展。只需少量代码,就可以以定义良好的格式公开整个数据库。这是最简单的部分

为了实现多属性,您可以在WCF数据服务应用程序中创建查询拦截器来实现该逻辑。拦截器的数量和您编写的代码的复杂性将取决于您的安全模型和需求。查看T4模板或CodeSmith之类的东西,根据数据库模式生成拦截器方法,可能是防止大量重复手动编码的一种方法


我提供的链接有很多关于WCF数据服务的信息和教程,可以从这里开始了解它是否能满足您的需求。我一直在关注WCF数据服务的一个类似问题(多租户),并希望了解您最终如何实现您的解决方案。

请投资拼写检查。在URL中输入“动词”不被视为RESTful。REST的基本原则之一是只使用GET、POST、PUT和DELETE作为动词。在这种情况下,GET将替换select,POST将替换insert,PUT将替换update。啊,很好。我没有意识到我在回答中这么做了。因此url可能都是相同的,只是在基本操作插入、更新、删除和选择中使用不同的HTTP谓词。执行此操作的一种标准方法是使用会话ID,通常在HTTP cookie头中传递。