Загрузить файл с помощью WCF REST

#.net #wcf #rest #file-upload

#.net #wcf #rest #файл-загрузить

Вопрос:

Я использую следующий код :

     static void test()
        {
            string address = "http://localhost:4700/HostDevServer/HelloWorldService.svc";
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(address);
            req.Method = "POST";
            req.ContentType = "text/xml;charset=UTF-8";
            Stream reqStream = req.GetRequestStream();
            string fileContents = "the quick brown fox jumped over the lazy dog.";
            byte[] bodyContents = Encoding.UTF8.GetBytes(fileContents);
            reqStream.Write(bodyContents, 0, bodyContents.Length);
            reqStream.Close();

            HttpWebResponse resp;
            try
            {
                **resp = (HttpWebResponse)req.GetResponse();**
            }
            catch (WebException e)
            {
                resp = (HttpWebResponse)e.Response;
            }
            Console.WriteLine("HTTP/{0} {1} {2}", resp.ProtocolVersion, (int)resp.StatusCode, resp.StatusDescription); 
        }



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace MyWCFServices
{
    public class HelloWorldService : IHelloWorldService
    {
        public String GetMessage(String name)
        {
            return "Hello world from "   name   "!";
        }

        public bool UploadFile(Stream fileContent)
        {
            using (StreamReader fileContentReader = new StreamReader(fileContent))
            {
                string content = fileContentReader.ReadToEnd();
                File.WriteAllText(Path.Combine(@"c:tempaa.tmp"), content);
            }
            return false;
        }  
    }
}



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Web;
using System.IO;
using System.Web;

namespace MyWCFServices
{
    [ServiceContract]
    interface IHelloWorldService
    {
        [OperationContract]
        String GetMessage(String name);

        [OperationContract]
        [WebInvoke(Method = "PUT", UriTemplate = "File/{fileName}")]
        //[WebContentType("application/octet-stream")]
        bool UploadFile(Stream fileContents); 

        //[OperationContract]
        //[WebInvoke(UriTemplate = "UploadFile/{fileName}")]
        //void UploadFile(string fileName, Stream fileContent); 
    }
}
  

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

Ответ №1:

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

Вероятно, вам следует закодировать байты файла как base 64, используя

 Convert.ToBase64String
  

Эффективная загрузка файла в виде строки.

На другом конце вы затем обрабатываете значение как строковый параметр в вашем методе обслуживания и используете

 Convert.FromBase64String
  

Чтобы получить байты, и тогда у вас снова будет исходный файл. В моей компании у нас есть веб-сервисы, которые мы используем для приема двоичных файлов, таких как docx , и вот как мы это делаем — это работает с удовольствием.