Загрузить данные в сервис wcf с помощью AFNetworking?Наконец-то работает!(содержит коды c # и obj-c) - PullRequest
2 голосов
/ 23 ноября 2011

Я работаю над проектом, который должен загружать файлы с iphone в службу wcf. У меня нет опыта как на wcf и afnetworking. я застрял на этом шаге в течение нескольких дней, и вот прогресс, который я сделал:

WCF Сервис для загрузки файлов: обратите внимание, что я скопировал этот код с сайта Codeproject .

public interface ITransferService
{
[OperationContract]
RemoteFileInfo DownloadFile(DownloadRequest request);

[OperationContract]
 void UploadFile(RemoteFileInfo request); 
}

    public void UploadFile(RemoteFileInfo request)
{
    FileStream targetStream = null;
    Stream sourceStream =  request.FileByteStream;

    string uploadFolder = @"C:\upload\";

    string filePath = Path.Combine(uploadFolder, request.FileName);

    using (targetStream = new FileStream(filePath, FileMode.Create, 
                          FileAccess.Write, FileShare.None))
    {
        //read from the input stream in 65000 byte chunks

        const int bufferLen = 65000;
        byte[] buffer = new byte[bufferLen];
        int count = 0;
        while ((count = sourceStream.Read(buffer, 0, bufferLen)) > 0)
        {
            // save to output stream
            targetStream.Write(buffer, 0, count);
        }
        targetStream.Close();
        sourceStream.Close();
    }

}

Код загрузки хорошо работает на клиентской программе, поставляемой с sourcode, я могу загрузить любой размер и любой тип или файлы через сервис wcf.

Я также обнаружил, что инфраструктура AFNetworking довольно популярна на ios, поэтому я решил ее использовать. Вот мой код для загрузки файла:

Я зашел так далеко, пожалуйста, помогите мне в этой ситуации. спасибо за помощь

ОК, вот новая информация:

Первый всего кода c # для загрузки файла в службу wcf (которая работает)

protected void Button1_Click(object sender, EventArgs e)
{ 
if (FileUpload1.HasFile)
{
    System.IO.FileInfo fileInfo = 
           new System.IO.FileInfo(FileUpload1.PostedFile.FileName);
    FileTransferServiceReference.ITransferService clientUpload = 
           new FileTransferServiceReference.TransferServiceClient();
    FileTransferServiceReference.RemoteFileInfo 
           uploadRequestInfo = new RemoteFileInfo();

    using (System.IO.FileStream stream = 
           new System.IO.FileStream(FileUpload1.PostedFile.FileName, 
           System.IO.FileMode.Open, System.IO.FileAccess.Read))
    {
        uploadRequestInfo.FileName = FileUpload1.FileName;
        uploadRequestInfo.Length = fileInfo.Length;
        uploadRequestInfo.FileByteStream = stream;
        clientUpload.UploadFile(uploadRequestInfo);
        //clientUpload.UploadFile(stream);
    }
}
}

Секунда: Класс remotefileinfo , который использовался для загрузки файла на сервер:

  public class RemoteFileInfo : IDisposable
  {
    [MessageHeader(MustUnderstand = true)]
     public string **FileName**;

    [MessageHeader(MustUnderstand = true)]
    public long **Length**;

    [MessageBodyMember(Order = 1)]
    public System.IO.Stream **FileByteStream**;

    public void Dispose()
    { 
        if (FileByteStream != null)
       {
        FileByteStream.Close();
        FileByteStream = null;
       }
    }   
  }

Из всего этого кода я понимаю, что мне нужно создать запрос, который содержит «Filename» «FileLength» и filedata «FileByteStream». я пытался что-то в кодах, но сервер выдает ошибку 415, когда я пытаюсь загрузить изображение с этим кодом:

   AFHTTPClient *client= [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://192.168.2.121:85"]];

UIImage *image = [UIImage imageNamed:@"test.jpg"];
NSData *data = UIImageJPEGRepresentation(image, 0.2);

NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
[parameters setObject:@"test.jpg" forKey:@"FileName"];
[parameters setObject:[NSString stringWithFormat:@"%i",data.length] forKey:@"Length"];

NSMutableURLRequest *myRequest = [client multipartFormRequestWithMethod:@"POST" path:@"/webservice/Transferservice.svc/UploadFile" parameters:parameters constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
    [formData appendPartWithFileData:data name:@"RemoteFileInfo" fileName:@"test.jpg" mimeType:@"image/jpeg"];
}];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:myRequest];
[operation 
 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
     NSLog(@"success: %@", operation.responseString);
 } 
 failure:^(AFHTTPRequestOperation *operation, NSError *error) {
     NSLog(@"error: %@", operation.error);
 }
 ];

[[[NSOperationQueue alloc] init] addOperation:operation];

также вот ссылка WSDL для сервиса:

WSDL Link

Мне действительно нужно это сделать, спасибо за помощь снова ...

Ответы [ 3 ]

3 голосов
/ 26 ноября 2011

Попробуйте это для размера:

AFHTTPClient *client= [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://192.168.2.121:85"]];

NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"test.jpg"], 0.2);

NSMutableURLRequest *myRequest = [client multipartFormRequestWithMethod:@"POST" path:@"/webservice/Transferservice.svc/UploadFile" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
    [formData appendPartWithFileData:data name:@"RemoteFileInfo" fileName:@"test.jpg" mimeType:@"image/jpeg"];
}];

AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:myRequest] autorelease];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *op, id responseObj) {
    NSLog(@"success: %@", operation.responseString);
} failure:^(AFHTTPRequestOperation *op, NSError *error) {
    NSLog(@"[Error]: (%@ %@) %@", [operation.request HTTPMethod], [[operation.request URL] relativePath], operation.error);
}];

NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
[queue addOperation:operation];

Вам не нужно передавать имя вашего файла или размер в параметрах вашего сообщения, вы можете указать это в форме получения.Не забывайте, что часть имени appendPartWithFileData должна использоваться вашим серверным сценарием для идентификации загрузки файла.

Все вышеперечисленное относится к PHP, но должно работать и для ASP.NET.

Также как и выше, ссылка не работает.

Приветствия

1 голос
/ 27 ноября 2011

Наконец, мне удалось загрузить файл в WCF через файловый поток. Проблема заключалась в том, что предыдущий код ожидал заголовок и поток в теле, что я не смог найти способ сделать это. вместо этого я обнаружил, что мне нужно написать код, который принимает только поток в качестве параметра, ничего особенного, а затем имя файла и другие вещи будут выполняться на стороне сервера.

У меня есть этот код загрузки для службы wcf из этого вопроса: Служба WCF для приема зашифрованных данных multipart / form-data

сделал именно то, что написано в ответе. а на стороне iphone я настроил поток ввода для своей операции. Вот код для AFNetworking для загрузки файлов в службу wcf:

AFHTTPClient *client= [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://192.168.2.121:85"]];

UIImage *image = [UIImage imageNamed:@"test.jpg"];
NSData *data = UIImageJPEGRepresentation(image, 0.2);
NSInputStream *stream = [[[NSInputStream alloc]initWithData:data] retain];
NSDictionary *parameters = nil;

NSMutableURLRequest *myRequest = [client requestWithMethod:@"POST" path:@"/uploadservice/service1.svc/Upload" parameters:nil];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:myRequest];

 [
 operation 
 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
     NSLog(@"success: %@", operation.responseString);
 } 
 failure:^(AFHTTPRequestOperation *operation, NSError *error) {
     NSLog(@"error: %@", operation.error);
 }
 ];

operation.inputStream = stream; //Thats where you put your stream!

[[[NSOperationQueue alloc] init] addOperation:operation];

Спасибо всем за терпение, даже ваши ответы не были полным ответом, ваши ответы привели меня к правильным ответам ...

0 голосов
/ 23 ноября 2011

Вы получаете сообщение об ошибке 404 или «Не найдено» с удаленного веб-сервера.

Это, вероятно, означает, что у вас неправильный URL-адрес или имя сервера - недостаточно информации о настройке на стороне сервера, чтобы мы могли определить, каким будет правильный URL-адрес.

...