Поточно повикване на уеб услуга във 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 сега е моето сапунено съобщение. Как да го накарам да предава поточно данни? Като контрола за качване на файл в скрипт за действие...   -  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; boundary=----------GI3Ij5Ij5ei4ae0Ij5ei4KM7ae0ei4' не беше очакваният тип 'text/xml; charset=utf-8'.' Ще се опитам да го поправя и ще публикувам всеки напредък.. - person Gluip; 16.01.2013
comment
Все още се боря с него. Изглежда, че моята услуга може да приема само текст/xml... - person Gluip; 16.01.2013
comment
Е, нещо дълбоко в паметта ми подсказва, че този тип съдържание на FileRefenence също не може да бъде променен. Вярвам, че трябва да конструирате HTTP заявка ръчно. - person David Goshadze; 16.01.2013
comment

Ако искате да добавите изображение от UIViewController, а не от подклас на UINavigationController, можете да направите нещо подобно:

-(void)addImageOnTopOfTheNavigationBar {
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yourImage"]];

   imageView.frame = CGRectMake(....); //set the proper frame here 
   [self.navigationController.view addSubview:imageView];

}
- person Gluip; 17.01.2013
comment
Да, помислих си за Urlloader. Събитията за напредък може да са проблем. Но наистина ли имате нужда от лента за напредъка? Може ли някакъв зает курсор, използван заедно с таймер за изчакване, да задоволи вашите нужди? - person David Goshadze; 17.01.2013
comment
Вече имах такава функционалност и в крайна сметка се придържахме към нея. IMHO наличието на лента за напредък беше МНОГО допълнителни усилия - person Gluip; 21.01.2013