2009-03-20 8 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 

Ciao, spero che tu possa aiutare ....WCF RESTful problema di caricamento delle immagini servizio

sto creando una semplice applicazione (forse pagina web) che avrà una semplice interfaccia utente e si caricare i file da un dispositivo esterno , l'app/pagina web verrà avviata tramite autorun.inf quando l'utente inserisce un dispositivo nel PC. Il webservice eseguirà il complesso lavoro di collegamento del file al sistema di gestione, ecc. Ciò consentirà agli utenti analfabeti IT che non possono utilizzare il file explore per inviare file al sistema di gestione ...!

Il problema che ho è che il mio serivce RESTful mi sta dando un errore 400 quando il tipo di contenuto è un image/jpeg .. Funziona bene per il text/plain o text/xml (vedi Post)

Grazie J

risposta

7

Si può provare a sovrascrivere qualsiasi tipo di contenuto e caricare tutti i file come application/octet-stream, o text/plain usando un 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); 
    } 
} 

E si dovrebbe modificare il contratto di servizio a guardare come questo

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

Anche se, se si sta caricando da una pagina web, non sarebbe il dato essere pubblicato in un multipart/form -formato dei dati?

+0

Proprio quello che stavo cercando! Non sono ancora sicuro del caricamento della pagina web, tuttavia potrei usare JavaScript per collegarmi al servizio, quindi dovrò anche fare una versione abilitata per JSON. Attraversa quel ponte quando/se lo raggiungo. L'app è un piccolo prototipo al mo. – jaimie

+2

Mi piace davvero questo WCF RESTful, sembra molto più pulito e sottile rispetto agli standard standard SOAP WS- * per l'interoperabilità. C'è un grande white paper su msdn: http://msdn.microsoft.com/en-us/library/dd203052.aspx per chiunque voglia saperne di più. Grazie per il tuo aiuto Ben ... J – jaimie

Problemi correlati