WCF REST分部类/接口-未找到终结点问题

本文关键字:问题 结点 接口 REST WCF | 更新日期: 2023-09-27 17:58:08

以下代码导致"找不到服务端点"错误。它使用分部类和分部接口。当我不使用分部类/接口时,它工作得很好。。。有什么错误吗?

[ServiceContract]
public partial interface IMySvc
{
    [WebGet(UriTemplate = "...")]
    [OperationContract]
    Stream GetProducts_1();
    [WebGet(UriTemplate = "...")]
    [OperationContract]
    Stream GetProducts_2();
}
public partial interface IMySvc
{
    [WebGet(UriTemplate = "...")]
    [OperationContract]
    Stream GetProducts_3();
    [WebGet(UriTemplate = "...")]
    [OperationContract]
    Stream GetProducts_4();
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public partial class MySvc: IMySvc
{
    //implementations of GetProducts_1, GetProducts_2
}
public partial class MySvc: IMySvc
{
    //implementations of GetProducts_3, GetProducts_4
}

在Global.asxc:

RouteTable.Routes.Add(new ServiceRoute("task", new WebServiceHostFactory(), typeof(MySvc)));

WCF REST分部类/接口-未找到终结点问题

这可能与它是分部类无关。这可能是许多不同的问题。你需要缩小问题的来源。尝试:

  • 首先构建一个简单的基本httpweb服务
  • 当你开始工作时,把它改成休息服务

下面是我如何制作的例子

这将是的第一套方法

[ServiceContract]
public partial interface IDefaultInterface
{
    [OperationContract]
    string getData1();
}
public partial class CDefaultClass : IDefaultInterface
{
    public getData1(){ return "data 1"; }
}

这将是您想要的另一组拆分的方法

[ServiceContract]
public partial interface IDefaultInterface2
{
    [OperationContract]
    string getData2();
}
public partial class CDefaultClass2 : IDefaultInterface2
{
    public getData2(){ return "data 2"; }
}

下面是我的导数逻辑和注释

namespace wcfMyService
{
    // this list all derivation for the easy to follow service.
    // this service will have LOTS of function so ability
    // to split in multiple classes was necessary
    // on client side we only see 1 set of function all mixed together
    // but at least working on it it's easy to follow for us since we have a structure
    #region Class Derivation
    public class CDerivative : CDefaultClass { }
    public partial class CDefaultClass : CDefaultClass2 { }  
    // NOTE THAT ALL NEW CLASSES MUST :
    // - Be PARTIAL classes
    // - Implement their OWN interface
    // new class would be
    // public partial class CDefaultClass2 : CMyNewClass { }
    // and so on. previous class derive from the new class
    #endregion
    #region Interface Derivation
    [ServiceContract]
    public interface IDerivative : IDefaultInterface { }
    public partial interface IDefaultInterface : IDefaultInterface2 { }
    // NOTE THAT ALL NEW INTERFACE MUST :
    // - Be PARTIAL Interface
    // - Have attribute [ServiceContract]
    // - all methods need [OperationContract] as usual
    // new class interface would be
    // public partial interface IDefaultInterface2 : IMyNewClass { }
    // and so on. previous class interface derive from the new class interface
    #endregion
}

现在,您只需添加派生AND接口即可获得正常的服务接口,这样端点就可以看到所有派生类的所有函数。Class内部不需要任何代码,因为它们从各自的接口实现自己的方法。因此,在每个类中没有数百万方法的集群

[ServiceContract]
public interface IService : IDerivative
{
}

最后,您需要将SVC/ASMX(不管怎样)编码如下,以便它公开WSDL等的所有内容。再次,此类中不需要任何代码

public partial class Service : CDerivative, IService
{       
}

因此,总的来说,当您想要在另一个类中使用新方法以获得更好的结构时,您所需要做的只是创建部分接口和部分类,就像您通常创建服务契约和操作一样。然后简单地进入派生文件,将接口和类添加到派生中。因为它们都只实现了自己的接口,所以不应该有任何冲突,而且当您编写代码时,您永远不会看到其他类的方法。

我非常喜欢这个组织,用合适的文件夹制作了漂亮的树视图,我可以很快找到成千上万的方法。