我遇到的问题与此非常相似: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问题的答案?
答案 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中,也不会为它们生成自动客户端代码,等等在编写客户端代码时,您必须知道这些操作的名称和参数。