Я пытаюсь использовать потоковую передачу WCF с Контрактами сообщений, потому что мне нужны дополнительные параметры помимо самого потока.
По сути, я создаю службу загрузки и выгрузки файлов с некоторой дополнительной логикой сверху.
К сожалению, когда я пытаюсь запустить сервис из браузера, чтобы проверить, что все в порядке, я получаю следующую ошибку:
Ошибка сервера в «/» приложении.
Операция «UploadFile» в контракте «IFileTransferService» использует MessageContract с заголовками SOAP. Заголовки SOAP не поддерживаются None MessageVersion.
К сожалению, поиск в Google не дал какого-либо существенного результата, который помог мне. Ребята, вы можете мне помочь? Вот подробности службы (я удалил часть загрузки по причине нехватки места).
[ServiceContract(Namespace = "http://www.acme.org/2009/04")]
public interface IFileTransferService
{
[OperationContract(Action = "UploadFile")]
void UploadFile(FileUploadMessage request);
}
[MessageContract]
public class FileUploadMessage
{
[MessageHeader(MustUnderstand = true)]
public FileMetaData Metadata { get; set; }
[MessageBodyMember(Order = 1)]
public Stream FileByteStream { get; set; }
}
[DataContract(Namespace = "http://schemas.acme.org/2009/04")]
public class FileMetaData
{
[DataMember(Name="FileType", Order=0, IsRequired=true)]
public FileTypeEnum fileType;
[DataMember(Name="localFilename", Order=1, IsRequired=false)]
public string localFileName;
[DataMember(Name = "remoteFilename", Order = 2, IsRequired = false)]
public string remoteFileName;
}
Я попытался использовать привязку basichttpbinding и привязку customhttp с не положительным эффектом:
<customBinding>
<binding name="customHttpBindingStream">
<textMessageEncoding messageVersion="Soap12" />
<httpTransport transferMode="Streamed" maxReceivedMessageSize="2147483647"/>
</binding>
</customBinding>
ОБНОВЛЕНИЕ : при чтении документации онлайн кажется, что потоковая передача с MessageContracts действительно должна быть возможной. См., Например, MSDN ( Большие данные и потоковая передача ):
Модель программирования для потоковых передач
Модель программирования для потоковой передачи
простой. Для получения
потоковые данные, укажите операцию
контракт, который имеет один поток
типизированный входной параметр. Для возвращения
потоковые данные, вернуть поток
ссылка. [...] Это правило аналогично
относится к сообщениям контрактов. Как показано
в следующем сообщении вы
может иметь только один член тела в
ваше сообщение сообщение, которое является
поток. Если вы хотите общаться
дополнительная информация с
поток, эта информация должна быть
переносится в заголовках сообщений.
тело сообщения исключительно зарезервировано
для потокового контента.
[MessageContract]
public class UploadStreamMessage
{
[MessageHeader]
public string appRef;
[MessageBodyMember]
public Stream data;
}
Я также видел сообщения в блогах людей, выполняющих услуги загрузки и скачивания файлов, очень похожие на то, что я пытаюсь собрать (например, здесь ).
ОБНОВЛЕНИЕ 2
Я попытался создать небольшую консоль и самостоятельно разместить службу с помощью BasicHttpBinding, и там она работает как шарм. Я начинаю верить, что проблема может быть в хостинге на IIS. Есть идеи?
ОБНОВЛЕНИЕ 3
Смотрите мой собственный ответ.