#.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
, и вот как мы это делаем — это работает с удовольствием.