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

हाय, आशा है कि आप मदद कर सकते हैं ....RESTful WCF सेवा छवि अपलोड समस्या

मैं एक सरल अनुप्रयोग (शायद वेबपेज) है कि एक साधारण यूआई होगा और एक बाहरी डिवाइस से फ़ाइलें अपलोड करेंगे बनाने हूँ , ऐप/वेबपृष्ठ autorun.inf के माध्यम से शुरू किया जाएगा जब उपयोगकर्ता वहां डिवाइस को पीसी में प्लग करता है। Webservice फ़ाइल को प्रबंधन प्रणाली आदि से जोड़ने का जटिल काम करेगा। यह आईटी अशिक्षित उपयोगकर्ताओं को सक्षम करेगा जो प्रबंधन प्रणाली में फाइल सबमिट करने के लिए फ़ाइल एक्सप्लोर का उपयोग नहीं कर सकते हैं ...!

समस्या मुझे लगता है कि मेरी RESTful serivce मुझे एक 400 त्रुटि दे रहा है जब सामग्री प्रकार एक image/jpeg है .. यह के लिए पाठ/सादा या text/xml ठीक काम करता है (ब्लॉग पोस्ट देखें)

है

धन्यवाद जे

उत्तर

7

आप किसी भी सामग्री-प्रकार को ओवरराइड करने और एप्लिकेशन/ऑक्टेट-स्ट्रीम, या टेक्स्ट/सादे को 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); 

तरह देखने के लिए संशोधित करना होगा -डेटा स्वरूप?

+0

बस मैं क्या कर रहा था! अभी तक वेबपृष्ठ अपलोड के बारे में निश्चित नहीं है, हालांकि मैं सेवा में शामिल होने के लिए जावास्क्रिप्ट का उपयोग कर सकता हूं, इसलिए मुझे JSON सक्षम संस्करण भी बनाना होगा। उस पुल को क्रॉस करें जब मैं इसे प्राप्त करूं। ऐप मो में एक छोटा सा प्रोटोटाइप है। – jaimie

+2

मैं वास्तव में इस रीस्टफुल डब्लूसीएफ को पसंद कर रहा हूं, यह इंटरऑपरेबिलिटी के लिए मानक एसओएपी डब्ल्यूएस- * मानकों की तुलना में इतना साफ और पतला लगता है। एमएसडीएन पर एक महान श्वेत पत्र है: http://msdn.microsoft.com/en-us/library/dd203052.aspx जो भी अधिक जानना चाहता है। आपकी मदद के लिए धन्यवाद बेन ... जे – jaimie

संबंधित मुद्दे