【问题标题】:WCF Data Service with a custom ServiceContract in the same classWCF 数据服务与同一类中的自定义 ServiceContract
【发布时间】:2015-09-02 15:02:24
【问题描述】:

我有一个与此非常相似的问题:Combine ADO.NET Data Service and custom ServiceContract in the same class?

(但是,我无法对此发表评论,因为我没有 50 声望......因此我必须提出一个新问题)

所以,我有一个 WCF 数据服务:

public class LearnDataService : DataService<LearnEntities>
{
    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("Customers", EntitySetRights.All);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
    }
}

我想用一些自定义的 WCF 服务操作来扩展它(他们将在现实生活中进行复杂的数据库查询,我将使用简单的调用来代替只是为了保持示例代码的简短)。所以,我创建了界面:

[ServiceContract]
public interface ICustomerService
{
    [OperationContract]
    List<Customer> GetCustomers();

    [OperationContract]
    Customer GetCustomerByCustomerId(string customerID);
}

像这样扩展服务类:

public class LearnDataService : DataService<LearnEntities>, ICustomerService
{
    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("Customers", EntitySetRights.All);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;


        config.SetServiceOperationAccessRule("GetCustomers", ServiceOperationRights.AllRead);
        config.SetServiceOperationAccessRule("GetCustomerByCustomerId", ServiceOperationRights.AllRead);
    }

    [WebGet]
    public List<Customer> GetCustomers()
    {
        var customers = (from c in this.CurrentDataSource.Customers
                       select c).ToList();

        return customers;
    }

    [WebGet]
    public Customer GetCustomerByCustomerId(string customerID)
    {
        var product = (from c in this.CurrentDataSource.Customers
                       where c.CustomerID == customerID
                       select c).FirstOrDefault(); ;

        return product;
    }
}

现在,当我尝试使用该服务时,我得到:

LearnDataService 实现了多种服务契约类型,并且没有 端点在配置文件中定义。

好的,正如我在上面链接的问题的答案中所说,我将配置文件设置如下:

<services>
  <service name="LearnService.LearnDataService">
    <endpoint address="data" binding="webHttpBinding" contract="System.Data.Services.IRequestHandler" />
    <endpoint address="cust" binding="webHttpBinding" contract="LearnService.ICustomerService" />
  </service>
</services>

现在,我正在尝试在客户端项目中为此服务添加服务引用。使用“添加服务引用...”并按下发现按钮,(当然服务在没有调试的情况下运行),它发现 ht_tp://localhost:7947/LearnDataService.svc url,我得到一个 404(难怪,那里什么都没有听...)

因为我没有 10 个声望,所以我不能发布超过 2 个链接。这包括本地主机链接,所以我必须以这种方式破坏它们:(对不起

现在,我将地址修改为 ht_tp://localhost:7947/LearnDataService.svc/data,然后它正确地发现了 LearnEntities 服务,打开它时,我可以看到客户实体。到目前为止一切顺利,所以我检查了另一个服务,ht_tp://localhost:7947/LearnDataService.svc/cust。发现时,我收到一个错误:

下载时出错 'ht_tp://localhost:7947/LearnDataService.svc/cust/_vti_bin/ListData.svc/$metadata'。 请求失败,HTTP 状态为 404:未找到。元数据包含 无法解析的引用: 'ht_tp://localhost:7947/LearnDataService.svc/cust'。没有 端点监听http://localhost:7947/LearnDataService.svc/cust 可以接受该消息。这通常是由不正确的 地址或 SOAP 操作。有关更多信息,请参阅 InnerException(如果存在) 细节。远程服务器返回错误:(404) Not Found。如果 服务在当前解决方案中定义,尝试构建解决方案 并再次添加服务引用。

使用浏览器尝试这些 URL 时,ht_tp://localhost:7947/LearnDataService.svc/data 有效,并以 XML 格式显示数据,但 URL ht_tp://localhost:7947/LearnDataService.svc/ cust 给出 404:(未找到端点。)

你有什么想法,配置有什么问题?我是否正确理解了链接的 SO 问题的答案?

【问题讨论】:

    标签: c# wcf service


    【解决方案1】:

    最后,我找到了解决方案。显然,没有办法通过像我上面尝试的那样通过向数据服务添加标准 WCF 服务查询来使其工作,但事实证明 WCF 数据服务对编写自定义查询有(有些有限)支持,称为 WCF 数据服务操作

    http://blogs.msdn.com/b/odatateam/archive/2010/05/26/service-operations-and-the-wcf-data-services-client.aspx https://msdn.microsoft.com/en-us/library/cc668788(v=vs.110).aspx

    这样我就可以完成我最初想做的事情。然而,这个解决方案并没有它应有的那么好,因为没有为这些操作定义服务契约,它们不会出现在 WSDL 中,也不会为它们自动生成客户端代码,等等。你必须知道名称和编写客户端代码时这些操作的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多