Проблема загрузки образа службы RESTful WCF - PullRequest
7 голосов
/ 20 марта 2009
1 namespace Uploader  
2 {  
3     using System;  
4     using System.IO;  
5     using System.ServiceModel;  
6     using System.ServiceModel.Description;  
7     using System.ServiceModel.Web;  
8     using System.Drawing;  
9     using System.Drawing.Imaging;  
10     using System.Net;  
11     using System.Xml;  
12   
13     [ServiceContract(Namespace = "http://Uploader")]  
14     public interface IUploaderService  
15     {  
16         [OperationContract, WebInvoke(Method = "POST",UriTemplate = "File/{fileName}")]  
17         bool UploadFile(string fileName, Stream fileContents);  
18     }  
19   
20     [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]  
21     public class UploaderService : IUploaderService  
22     {  
23         public bool UploadFile(string fileName, Stream fileContents)  
24         {  
25             return true;  
26         }  
27     }  
28   
29     class Program  
30     {  
31         static void Main()  
32         {  
33             var host = new   
34                 ServiceHost(typeof (UploaderService),   
35                 new Uri("http://localhost:8080/Uploader"));  
36             host.AddServiceEndpoint("Uploader.IUploaderService",   
37                 new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());  
38             try  
39             {  
40                 host.Open();  
41                 Console.WriteLine(host.BaseAddresses[0].AbsoluteUri + " running.");  
42                 Console.WriteLine();  
43                 var uri = "http://localhost:8080/Uploader/file.jpg";  
44                 var req = WebRequest.Create(uri) as HttpWebRequest;  
45                 if (req != null)  
46                 {  
47                     req.Method = "POST";  
48                     req.ContentType = "image/jpeg";  
49                     var reqStream = req.GetRequestStream();  
50                   
51                     var imageStream = new MemoryStream();  
52                     using (var i = Image.FromFile(@"c:\photo.jpg"))   
53                         i.Save(imageStream, ImageFormat.Jpeg);  
54                       
55                     var imageArray = imageStream.ToArray();  
56                     reqStream.Write(imageArray, 0, imageArray.Length);  
57                     reqStream.Close();  
58                     var resp = (HttpWebResponse)req.GetResponse();  
59                     var r = new XmlTextReader(resp.GetResponseStream());  
60                     if (r.Read())  
61                     {  
62                         Console.WriteLine(r.ReadString());      
63                     }  
64                 }  
65                 Console.WriteLine("Press <ENTER> to quit.");  
66                 Console.ReadLine();  
67             }  
68             catch (Exception ex)  
69             {  
70                 Console.WriteLine(ex.Message);  
71                 Console.ReadKey();  
72             }  
73             finally  
74             {  
75                 if (host.State == CommunicationState.Faulted)  
76                     host.Abort();  
77                 else  
78                     host.Close();  
79             }  
80         }  
81     }  
82 }  
83   
84   

Привет, надеюсь, вы можете помочь ....

Я создаю простое приложение (возможно, веб-страницу), которое будет иметь простой пользовательский интерфейс и загружать файлы с внешнего устройства. Приложение / веб-страница будет запущено через autorun.inf, когда пользователь подключит устройство к своему ПК. Веб-служба выполнит сложную работу по связыванию файла с системой управления и т. Д. Это позволит ИТ-неграмотным пользователям, которые не могут использовать файл, отправлять файлы в систему управления ...!

Проблема, с которой я столкнулся, заключается в том, что моя служба RESTful выдает ошибку 400, когда тип контента - изображение / JPEG. Он отлично работает для текста / обычного или текста / XML (см. Блог)

Спасибо J

1 Ответ

7 голосов
/ 20 марта 2009

Вы можете попытаться переопределить любой тип контента и загрузить все файлы в виде application / octet-stream или text / plain, используя IOperationBehavior.

public class WebContentTypeAttribute : Attribute, IOperationBehavior, IDispatchMessageFormatter
{
    private IDispatchMessageFormatter innerFormatter;
    public string ContentTypeOverride { get; set; }

    public WebContentTypeAttribute(string contentTypeOverride)
    {
        this.ContentTypeOverride = contentTypeOverride;
    }


    // IOperationBehavior
    public void Validate(OperationDescription operationDescription)
    {

    }

    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
    {
        innerFormatter = dispatchOperation.Formatter;
        dispatchOperation.Formatter = this;
    }

    public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
    {

    }

    public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
    {

    }

    // IDispatchMessageFormatter
    public void DeserializeRequest(Message message, object[] parameters)
    {
        if (message == null)
            return;

        if (string.IsNullOrEmpty(ContentTypeOverride))
            return;

        var httpRequest = (HttpRequestMessageProperty)message.Properties[HttpRequestMessageProperty.Name];
        httpRequest.Headers["Content-Type"] = ContentTypeOverride;
    }

    public Message SerializeReply(MessageVersion messageVersion, object[] parameters, object result)
    {
        return innerFormatter.SerializeReply(messageVersion, parameters, result);
    }
}

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

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

Хотя, если вы загружаете с веб-страницы, не будут ли данные размещены в формате multipart / form-data?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...