0

次のコードは、「サービス エンドポイントが見つかりません」というエラーにつながります。部分クラスと部分インターフェースを使用します。部分クラス/インターフェイスを使用しない場合、正常に動作します...エラーはありますか?

[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)));
4

2 に答える 2

0

これはおそらく、部分クラスであることとは関係ありません。それは多くの異なる問題である可能性があります。問題の原因を絞り込む必要があります。試す:

  • 単純な基本的な http Web サービスであるサービスを構築することから始めます。
  • それが機能するようになったら、残りのサービスに変更します。
于 2013-02-06T20:55:04.220 に答える
0

ここで私が私のものを作った例

これはメソッドの最初のセットになります

[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 インターフェイスを追加するだけで、エンド ポイントがすべての派生クラスのすべての関数を参照できるようになります。クラスは個々のインターフェースから独自のメソッドを実装するため、内部にコードは必要ありません。したがって、各クラスに数百万のメソッドのクラスターはありません

[ServiceContract]
public interface IService : IDerivative
{

}

最後に、SVC/ASMX (何でも) を次のようにコーディングして、WSDL などのすべてを公開する必要があります。このクラスでもコードは必要ありません

public partial class Service : CDerivative, IService
{       
}

したがって、全体として、より良い構造のために別のクラスに新しいメソッドが必要な場合に必要なことは、通常サービス コントラクトと操作を作成する場合と同様に、部分インターフェイスと部分クラスを作成するだけです。次に、派生ファイルに移動して、インターフェイスとクラスを派生に追加します。それらはすべて独自のインターフェイスのみを実装しているため、衝突は発生しないはずであり、コーディングすると、他のクラスのメソッドが表示されることはありません。

私はこの構成がとても好きで、適切なフォルダで素敵なツリー ビューを作成しており、そこにある何千ものメソッドの中からすぐに見つけ出すことができます。

于 2014-03-28T13:57:31.703 に答える