0

VS2012 と NetTcpBinding を使用します。クライアントから serviceContract を呼び出すと、次のエラーが発生します。サービスは IIS でホストされています。

パラメータ CS.ServiceContracts.Zzzzzz.Common:GetZipCodesResult をシリアル化しようとしているときにエラーが発生しました。InnerException メッセージは、データ コントラクト名が「DelegateSerializationHolder.DelegateEntry: http://schemas.datacontract.org/2004/07/System 」の「Type 'System.DelegateSerializationHolder+DelegateEntry」でした。DataContractResolver の使用を検討するか、既知の型のリストに静的に認識されていない型を追加します。たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加します。詳細については、InnerException を参照してください。

これが私のServiceContractです:

  [ServiceContract(SessionMode = SessionMode.Allowed, Namespace = "CS.ServiceContracts.Zzzzzz.Common",
    Name = "IZzzzzzCommonService")]
public interface IZzzzzzCommonService
{
    [OperationContract]
    GetZipCodesResponse GetZipCodes(GetZipCodesRequest request);
}

これが私のDataContractです:

[DataContract]
[Serializable]
public class GetZipCodesResponse : ResponseBase
{
    [DataMember(IsRequired = true)]
    public List<ZipCodes> ZipCodes { get; set; }
}

ResponseBase は次のとおりです。

[DataContract]
[Serializable]
[KnownType(typeof(GetZipCodesResponse)), XmlInclude(typeof(GetZipCodesResponse))]
public class ResponseBase
{
    [DataMember(IsRequired = true)]
    public int ResponseCode { get; set; }

    [DataMember(IsRequired = false)]
    public int ReasonCode { get; set; }

    [DataMember(IsRequired = false)]
    public string ReasonText { get; set; }
}

以下は、serviceContract インターフェイスの実装です。

public class ZzzzzzCommonService : IZzzzzzCommonService
{
 public GetZipCodesResponse GetZipCodes(GetZipCodesRequest request)
    {
        var response = new GetZipCodesResponse();
        try
        {
            response.ZipCodes = ZipCodes.GetCustom(request.ZipCode, request.City, request.State);

        }
        catch (Exception ex)
        {
            this.BuildExceptionResponse(response, ex);
        }

        return response; // I get to this line ok, but here is where the error occurs
    }
}

サービスを呼び出すクライアント コードは次のとおりです。

 public void ZipCodes()
    {
        var endPoint = new EndpointAddress(
            "net.tcp://localhost/CS.WebService.Zzzzzz.Common/ZzzzzzCommonService.svc");

        var binding = new NetTcpBinding { TransferMode = TransferMode.Buffered, SendTimeout = TimeSpan.MaxValue, ReceiveTimeout = TimeSpan.MaxValue, MaxReceivedMessageSize = 100000000, MaxBufferSize = 100000000 };

        using (var channel = new ChannelFactory<IZzzzzzCommonService>(binding, endPoint))
        {
            try
            {
                channel.Endpoint.Contract.SessionMode = SessionMode.Allowed; 
                var proxy = channel.CreateChannel();
                var request = new GetZipCodesRequest();

                request = new GetZipCodesRequest { ZipCode = "32701" };
                response = proxy.GetZipCodes(request);
            }
        }

   }

コードをデバッグし、エンティティに入り、dataSet に適切な行が入力されていますが、データセットが送り返されたときにエラーが発生しました。

何が欠けているのかわからない。serviceContract および dataContract メンバーが正しく装飾されていると思うので、リストのシリアル化に問題がある理由がわかりません。

4

1 に答える 1

0

問題は ZipCode クラスでした。Entity クラスであり、シリアル化できませんでした。そのため、クラスを分解し、クライアントに送り返すことができました。

于 2013-07-25T18:47:21.453 に答える