8

string[]受け入れて返すファイル解析 Web サービスを開発 (WCF に書き直します) しますISection[]が、実際には、これはネストされたインターフェイスのセットです。

namespace Project.Contracts // Project.Contracts.dll
{
    public interface ISection { }

    public interface ISummarySection : ISection { }

    public interface IDataSection : ISection { }
}

およびクラス:

namespace Project.Format.A // Project.Format.A.dll
{
    [DataContract]
    public class SummarySectionFormatA : ISummarySection { }

    [DataContract]
    public class DataSectionFormatA : IDataSection { }
}

サービス インターフェイスとその実装:

[ServiceContract]
public interface IService // Project.Contracts.dll
{
    ISection[] Parse(string format, string[] data);
} 

[ServiceKnownType(typeof(SummarySectionFormatA))] // tried this also
[ServiceKnownType(typeof(DataSectionFormatA))]
public class Service : IService // Project.Service.dll
{
    public ISection[] Parse(string format, string[] data)
    {
        return Factory.Create(format).Parse(data);
    }
}

declaredTypesサーバーとクライアントの両方で構成しようとしました:

<system.runtime.serialization>
  <dataContractSerializer>
    <declaredTypes>
      <add type="Project.Contracts.ISumarySection, Project.Contracts">
        <knownType type="Project.Format.A.SummarySectionFormatA, Project.Format.A" />
      </add>
      <add type="Project.Contracts.IDataSection, Project.Contracts">
        <knownType type="Project.Format.A.DataSectionFormatA, Project.Format.A" />
      </add>
    </declaredTypes>
  </dataContractSerializer>
</system.runtime.serialization>

しかし、それでも同じエラーが発生します:

「データ コントラクト名 'DataSection:http://schemas.example.com/Parse' で 'DataSectionFormatA' を入力することは想定されていません。

また

基になる接続が閉じられました: 接続が予期せず閉じられました。

Contracts プロジェクトは Format プロジェクトを参照せず、参照すると設計が壊れるため、KnownTypeAttribute でインターフェイスを装飾することはできません。そのため、config を使用したいと考えています。

4

3 に答える 3

2

以下のコードを見てください

[ServiceContract]
[ServiceKnownType(typeof(SummarySectionFormatA))]
[ServiceKnownType(typeof(DataSectionFormatA))]
public interface IService {}

public class Service : IService {}
于 2012-06-30T13:18:04.010 に答える
1

実装を少し変更する必要があると思います...この質問を見て、それが役立つかどうかを確認してください。

于 2012-07-02T07:23:49.910 に答える
0

これを機能させようとしています:

[KnownType("GetKnownType")]
public class Section
{
    static Type[] GetKnownType()
    {
        return new[]
        {
            Type.GetType("Project.Format.A.DataSectionFormatA, Project.Format.A")
        };
    }
}

しかし、サーバーとクライアントの両方が Project.Format.A.dll を参照して動作させる必要があるようです(メソッドは null を返しません)

于 2012-07-02T07:03:45.413 に答える