Потоковый вызов веб-службы в Flex

Я пытаюсь создать загрузку файла в приложении Flex / Air, которое отправляет информацию в веб-сервис .NET wcf SOAP. Загрузка файла также должна иметь события, указывающие на прогресс. Служба использует Stream как MessageBodyMember, чтобы разрешить потоковую загрузку. Мой ввод выглядит примерно так:

[MessageContract]
public class SendFileRequestMessage : IDisposable
{
    public string UserName;

    [MessageBodyMember(Order = 1)]
    public Stream FileData;
}

а сервис выглядит так:

public interface IFileTransferService
{
    [OperationContract]
    SendFileResponseMessage SendFile(SendFileRequestMessage request);
}

Теперь, когда я создаю прокси-класс в VS2010, я получаю объект Stream для FileData. Если я сделаю то же самое в Flash Builder 4.7, FileData будет интерпретироваться как ByteArray. Я уже изучал FileUpload и UrlLoader в своем клиенте, но не могу получить набор членов тела. Мой сценарий действий теперь выглядит так: не работает

var dataToSave:XML = <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:q0="http://mystuff/uploadservice/v1"><soapenv:Body><q0:SendFile/></soapenv:Body></soapenv:Envelope>

            var request:URLRequest = new URLRequest("http://localhost:31454/Uploadhandler.svc");
            request.requestHeaders = new Array(new URLRequestHeader("SOAPAction", "http://mystuff/uploadservice/v1/IFileTransferService/SendFile"));
            request.data = dataToSave;
            request.contentType = "text/xml; charset=utf-8";

            request.method = URLRequestMethod.POST;

            var loader:URLLoader = new URLLoader();
            loader.load(request);

Итак, как можно загрузить потоковый файл в службу мыла из Flex? Любая помощь будет очень признательна.


person Gluip    schedule 15.01.2013    source источник
comment
Я предполагаю, что dataToSave должен быть закодирован в base64.   -  person David Goshadze    schedule 16.01.2013
comment
но теперь dataToSave - это мое мыльное сообщение. Как мне заставить его передавать данные? Как элемент управления fileUpload в сценарии действия ...   -  person Gluip    schedule 16.01.2013
comment
Ой, извините. Не читал внимательно. Отправил ответ, так как он слишком велик для комментариев.   -  person David Goshadze    schedule 16.01.2013


Ответы (1)


Я не знаком с моделью .NET SOAP, но если она ожидает стандартного размещения содержимого http для данных файла, вы можете попробовать получить объект FileReference для своего файла, а затем передать свой URLRequiest в его методе загрузки. В вашем случае это может быть как

        ... Create class level variable ...
        var fr:FileReference = new FileReference();

        ... Obtain file reference somewhere ...
        //Set handlers for Filereference events 
        fr.browse(); //Obtain actual file reference  


        ... Somewhere in selectHandler chain....

        var dataToSave:XML = <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:q0="http://mystuff/uploadservice/v1"><soapenv:Body><q0:SendFile/></soapenv:Body></soapenv:Envelope>

        var request:URLRequest = new URLRequest("http://localhost:31454/Uploadhandler.svc");
        request.requestHeaders = new Array(new URLRequestHeader("SOAPAction", "http://mystuff/uploadservice/v1/IFileTransferService/SendFile"));
        request.data = dataToSave;
        request.contentType = "text/xml; charset=utf-8";
        request.method = URLRequestMethod.POST;

        //Do POST
        fr.upload(request);

Эта документация содержит примеры для используя FileReference.

person David Goshadze    schedule 16.01.2013
comment
Привет, Дэвид, спасибо за вашу помощь. Теперь я получаю сообщение об ошибке от службы: «HTTP / 1.1 415 Невозможно обработать сообщение, поскольку тип содержимого» multipart / form-data; border = ---------- GI3Ij5Ij5ei4ae0Ij5ei4KM7ae0ei4 'не был ожидаемым типом' text / xml; charset = utf-8 '.' Попробую исправить и буду выкладывать все проги .. - person Gluip; 16.01.2013
comment
Все еще пытаюсь с этим справиться. Кажется, что моя служба может принимать только text / xml ... - person Gluip; 16.01.2013
comment
Что ж, что-то глубоко в моей памяти подсказывает, что тип содержимого FileRefenence тоже нельзя изменить. Я считаю, что нужно создавать HTTP-запрос вручную. - person David Goshadze; 16.01.2013
comment
Вы имеете в виду urlloader? Я думаю, что событие прогресса больше не работает, как показано здесь forum.adobe.com/message/2902327 если вы не делаете отдельные запросы ... - person Gluip; 17.01.2013
comment
Да я подумал об Urlloader. События прогресса могут быть проблемой. Но действительно ли вам нужен индикатор выполнения? Может ли какой-нибудь курсор занятости, используемый вместе с таймером тайм-аута, удовлетворить ваши потребности? - person David Goshadze; 17.01.2013
comment
У меня уже была такая функциональность, и в конце концов мы остановились на ней. ИМХО наличие индикатора выполнения было МНОГО дополнительных усилий - person Gluip; 21.01.2013