Проблема с отправкой WCF клиенту - PullRequest
1 голос
/ 13 ноября 2009

Фон

Преобразование с использованием .Net Remoting в WCF. Большинство методов на сервере WCF работают нормально, но столкнулись с тем, что сегодня не работает.

Это договор на обслуживание:

[ServiceContract]
public interface IMyService
{
  [OperationContract]
  generated.Response.ACS_Response Check(generated.Request.ACS_Request request);
}

Я перехватил остальные методы этого интерфейса, так как они работают. По сути, я пытаюсь передать объект запроса и получить объект ответа.

Классы для ACS_Response и ACS_Reqeust создаются с использованием XSD.exe для файла XSD. Эти классы находятся в сборке Api, на которую ссылаются как клиент WCF, так и хост WCF.

Задача

Я могу сделать вызов хосту WCF и объекту запроса, и хост может выполнить свою работу. Когда хост пытается вернуть объект Response, я сталкиваюсь с исключением.

Я включил трассировку для WCF и вижу исключение SerializationException:

Type 'Api.generated.Response.ACS_ResponseQuestion'
with data contract name 'ACS_ResponseQuestion:http://...' is
not expected.  Add any types not known statically.........

Вопросы

Во-первых, я в замешательстве, потому что я могу успешно отправить объект Request, так что может показаться, что основы работают.

Во-вторых, эта сериализация работала в .Net Remoting. Все классы генерируются WSDL, поэтому они не должны быть сериализуемыми как есть?

В-третьих, хост и клиент ссылаются на одну и ту же сборку Api, которая определяет эти классы, поэтому они известны и серверу, и клиенту.

Ответы [ 3 ]

2 голосов
/ 13 ноября 2009

Я полагаю, это потому, что Api.generated.Response.ACS_ResponseQuestion не используется в контракте (API), поэтому он не помечается автоматически как известный тип.

Прочитайте эти статьи, они должны объяснить все:

  1. Известные типы
  2. Данные контракта, известные типы
  3. Понимание известных типов

Быстрое решение: попробуйте добавить это к классу, который реализует интерфейс:

[KnownType(typeof(Api.generated.Response.ACS_ResponseQuestion))]

Если это не работает, возможно, вам придется объявить его как ServiceKnownType:

// Define a service contract and apply the ServiceKnownTypeAttribute
// to specify types to include when generating client code. 
// The types must have the DataContractAttribute and DataMemberAttribute
// applied to be serialized and deserialized. The attribute specifies the 
// name of a method (GetKnownTypes) in a class (Helper) defined below.
[ServiceKnownType("GetKnownTypes", typeof(Helper))]
[ServiceContract()]
public interface ICatalog
{
    // Any object type can be inserted into a Hashtable. The 
    // ServiceKnownTypeAttribute allows you to include those types
    // with the client code.
    [OperationContract]
    Hashtable GetItems();
}

// This class has the method named GetKnownTypes that returns a generic IEnumerable.
static class Helper
{
    public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
    {
        System.Collections.Generic.List<System.Type> knownTypes =
            new System.Collections.Generic.List<System.Type>();
        // Add any types to include here.
        knownTypes.Add(typeof(Widget));
        knownTypes.Add(typeof(Machine));
        return knownTypes;
    }
}

[DataContract()]
public class Widget
{
    [DataMember]
    public string Id;
    [DataMember]
    public string Catalog;
}

[DataContract()]
public class Machine : Widget
{
    [DataMember]
    public string Maker;
}
1 голос
/ 14 ноября 2009

Посмотрите на этого ServiceKnownType провайдера. Это спасет вас от горя. Вам очень просто зарегистрировать базовый тип, и он будет сканировать сборку для всех классов, которые наследуются от базового класса.

0 голосов
/ 13 ноября 2009

Вы ссылаетесь на классы как клиента, так и сервера, поэтому я бы порекомендовал вам взглянуть на этот способ выполнения WCF:

http://www.dnrtv.com/default.aspx?showNum=122

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...