2009-03-20 15 views
7
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 

Cześć, nadzieję, że może pomóc ....relaksującego WCF usługa przesyłania obrazu Problem

tworzę prostą aplikację (być może) strony internetowej, która będzie miała prosty interfejs użytkownika i przesyłać pliki z urządzenia zewnętrznego , aplikacja/strona internetowa zostanie uruchomiona za pośrednictwem autorun.inf, gdy użytkownik podłączy urządzenie do komputera. Serwis internetowy wykona złożone zadanie połączenia pliku z systemem zarządzania itd. Umożliwi to niepiśmiennych użytkowników IT, którzy nie mogą korzystać z eksploracji plików w celu przesyłania plików do systemu zarządzania ...!

Mam problem jest, że moje relaksującego serivce daje mi błąd 400, gdy typ zawartość jest image/jpeg .. To działa dobrze dla text/plain lub text/xml (patrz blogu)

Dzięki J

Odpowiedz

7

Możesz spróbować zastąpić dowolny typ zawartości i przesłać wszystkie pliki jako strumień aplikacji/oktetu lub tekst/zwykły przy użyciu 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); 
    } 
} 

I trzeba by zmodyfikować swój kontrakt Obsługi wyglądać tak jednym

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

Chociaż, jeśli jest wysyłana ze strony internetowej, nie dane publikowane w formie wieloczęściowy/-Format danych?

+0

Właśnie o to mi chodziło! Not sure about the upload strony jeszcze, jednak mogę używać JavaScript do podłączenia do usługi, więc będę musiał zrobić wersję obsługującą JSON. Przejdź przez ten most, gdy/jeśli do niego dojdę. Aplikacja jest małym prototypem w mg. – jaimie

+2

Naprawdę podoba mi się to RESTful WCF, wydaje się o wiele czystsze i cieńsze niż standardowe standardy SOAP WS- * dla interoperacyjności. Na stronie msdn znajduje się świetna biała publikacja: http://msdn.microsoft.com/en-us/library/dd203052.aspx dla każdego, kto chce wiedzieć więcej. Dzięki za pomoc Ben ... J – jaimie