WCF数据服务与同一类中的自定义ServiceContract

时间:2015-09-02 15:02:25

标签: c# wcf service

我遇到的问题与此非常相似: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实现了多个servicecontract类型,没有   端点在配置文件中定义。

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

<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网址,我得到一个404(难怪,没有什么可以听的......)

由于我没有10个声望,我不能发布超过2个链接。这包括localhost链接,所以我必须以这种方式破坏它们:(抱歉

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

  

下载时出错   'ht_tp://本地主机:7947 / LearnDataService.svc /卡斯特/ _vti_bin / ListData.svc / $元数据'。   请求失败,HTTP状态为404:未找到。元数据包含   无法解决的引用:   'ht_tp://本地主机:7947 / LearnDataService.svc /卡斯特'。没有   端点监听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问题的答案?

1 个答案:

答案 0 :(得分:1)

最后,我找到了解决方案。显然,没有办法通过向我上面尝试的数据服务添加标准WCF服务查询来实现这一点,但事实证明,WCF数据服务对编写自定义查询(有点受限)支持,称为< strong> 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中,也不会为它们生成自动客户端代码,等等在编写客户端代码时,您必须知道这些操作的名称和参数。