Служба WCF не распознает мой собственный тип данных - PullRequest
2 голосов
/ 07 сентября 2010

Я экспериментирую с созданием концепции загрузки сервиса WCF. Я частично обнаружил следующее в сообщениях блога в сети:

namespace GreenWebMediaService
{    
    [ServiceContract]
    public interface IMediaServer
    {

        [OperationContract]
        void UploadData(UploadFile data);
    }


    // Use a data contract as illustrated in the sample below
    // to add composite types to service operations.
    [DataContract]
    public class UploadFile
    {
        public UploadFile() { }

        [MessageHeader]
        public string MetaData { get; set; }

        [MessageBodyMember]
        public Stream data { get; set; }
    }
}

Я запускаю его (хостинг в Visual Studio) и делаю ссылку из только что созданного приложения Windows Form, это моя ссылка из app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IMediaServer" closeTimeout="00:01:00"
                 openTimeout="00:01:00" receiveTimeout="00:10:00"
                 sendTimeout="00:01:00" allowCookies="false"
                 bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                 maxBufferSize="65536" maxBufferPoolSize="524288"
                 maxReceivedMessageSize="65536" messageEncoding="Text"
                 textEncoding="utf-8" transferMode="Buffered"
                 useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192"
                        maxArrayLength="16384" maxBytesPerRead="4096"
                        maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
                       realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:49689/MediaServer.svc"
                binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IMediaServer"
                contract="mediaServer.IMediaServer"
                name="BasicHttpBinding_IMediaServer" />
    </client>
  </system.serviceModel>
</configuration>

когда я создаю его экземпляр и обращаюсь к нему следующим образом:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();            
            IMediaServer mediaServer = new mediaServer.MediaServerClient();
            UploadFile file = new UploadFile();            
            mediaServer.UploadData(null);
        }
    }

Когда я обращаюсь к переменной «file», она имеет только свойство «file.ExtensionData», тогда как я ожидаю, что получу доступ к свойствам, которые я сделал в своем классе «UploadFile». Что мне не хватает? Я попытался сделать галочку в диалоге настройки в Visual Studio, поскольку нашел эту информацию в других темах, но все же не повезло: см. Мой диалог здесь: http://screencast.com/t/NzhhNzM3Y2Q (извините, я не знаю, как долго будет работать screencast.com это изображение)

Ответы [ 2 ]

3 голосов
/ 07 сентября 2010

Вы комбинируете DataContract с MessageHeader и MessageBodyMember атрибутами.Вы должны использовать

, а не их комбинация.Поэтому ваша UploadFile декларация должна выглядеть следующим образом:

[DataContract]
public class UploadFile
{
    [DataMember] public string MetaData { get; set; }
    [DataMember] public Stream data { get; set; }
}

или примерно так:

[MessageContract]
public class UploadFile
{
    [MessageHeader] public string MetaData { get; set; }
    [MessageBodyMember] public Stream data { get; set; }
}
1 голос
/ 07 сентября 2010

Я вижу две проблемы в вашем коде. Первая проблема - это определение DataContract. Это совершенно неправильно. Как уже указывал Рональд, вы комбинируете DataContract и MessageContract. Вы должны использовать второе предложение Рональда (первое не будет работать):

[MessageContract] 
public class UploadFileRequest // Good naming convention for message contracts 
{ 
    // Streaming over HTTP demands only single body member of type Stream
    // any other data have to be passed as custom headers - that is the reason
    // why mentioned data contract doesn't work. 
    [MessageHeader] public string MetaData { get; set; } 
    [MessageBodyMember] public Stream Data { get; set; } 
} 

Вторая проблема - Stream как элемент body для вашего запроса. Это возможно только при использовании режима передачи Streamed или StreamedRequest на BasicHttpBinding. Эта информация должна быть установлена ​​в определении привязки клиента вручную - она ​​не передается в WSDL / метаданных и не является функционально совместимой функцией.

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