Ответ Webservice превращается в параметр ref при использовании MessageContract - PullRequest
2 голосов
/ 03 марта 2010

Я определил следующий интерфейс

[ServiceContract]
public interface IHealthProducts
{
    [OperationContract()]
    ResponseClass OrderSelfSignedHealthCertificate();
}

, который возвращает следующий тип

[MessageContract]
public class ResponseClass
{
    [MessageBodyMember]
    public string AnimalSpeciesCode
    {
        get;
        set;
    }

    [MessageBodyMember]
    public int VBN
    {
        get;
        set;
    }
}

Я ожидал, что сгенерированный код клиента предоставит метод OrderSelfSignedHealthCertificate следующим образом:

HealthProductsClient client = new HealthProductsClient();
ResponseClass response = client.OrderSelfSignedHealthCertificate();

Вместо этого свойства ResponseClass не переносятся в ResponseClass, а отображаются следующим образом:

string OrderSelfSignedHealthCertificate(out int VBN)

Когда я обмениваю MessageContract на атрибут DataContract и MessageBodyMember на атрибут DataMember, я получаю ожидаемое поведение (тип ответа ResponseClass). Однако мне нужен MessageContract, потому что мне нужно поместить некоторые свойства в заголовок SOAP.

Я что-то не так делаю? Это нормальное поведение? Как получить тип возврата ResponseClass при использовании MessageContract?

Любая помощь с благодарностью.

Ответы [ 3 ]

1 голос
/ 05 марта 2010

Спасибо Марк, это сделал. Я создал общий класс ResponseWrapper для инкапсуляции возвращаемых типов:

[MessageContract(WrapperNamespace = "http://mynamespace.com")]
public class ResponseWrapper<T>
{
    [MessageBodyMember(Namespace = "http://mynamespace.com")]
    public T Response
    {
        get;
        set;
    }
}

Я определил тип возврата OrderSelfSignedHealthCertificate как

ResponseWrapper<ResponseClass> OrderSelfSignedHealthCertificate();

В моем коде клиента это переводится как

ResponseClass OrderSelfSignedHealthCertificate(); 

Что я и хотел. Спасибо!

1 голос
/ 03 марта 2010

Если ваш [MessageContract] содержит более одного [MessageBodyMember], то WCF вернет первое в качестве возвращаемого значения из вызова службы (AnimalSpeciesCode в вашем случае), а все остальные будут возвращены как out или ref paraemters.

Вы можете решить эту проблему, имея только один [MessageBodyMember] в вашем контракте на сообщения, который включает в себя все элементы, которые вам нужно вернуть, что-то вроде этого:

[DataContract]
class CompoundData
{
    public string AnimalSpeciesCode { get; set; }
    public int VBN { get; set; }
}

[MessageContract]
public class ResponseClass
{
    [MessageBodyMember]
    public CompoundData Payload { get; set; }
}

В этом случае CompoundData должно быть значением, возвращаемым из вашего вызова службы - содержащим оба элемента, которые вам нужны.

0 голосов
/ 05 марта 2010

Я разместил продолжение этого вопроса здесь .Универсальные возвращаемые типы не имеют правильного имени при использовании MessageContract.

...