2012-04-04 12 views
6

इम इतना की तरह एक WCF बाकी सेवा से एक छवि प्राप्त करने की कोशिश:शरीर पैरामीटर 'चौड़ाई'। परिचालन प्राप्त करने के लिए शरीर नहीं हो सकता है?

[ServiceContract] 
public interface IReceiveData 
{ 
    [OperationContract] 
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "picture/")] 
    //this line is wrong though 
    Stream GetImage(int width, int height); 
} 
public class RawDataService : IReceiveData 
{ 
    public Stream GetImage(int width, int height) 
    { 
     // Although this method returns a jpeg, it can be 
     // modified to return any data you want within the stream 
     Bitmap bitmap = new Bitmap(width, height); 
     for (int i = 0; i < bitmap.Width; i++) 
     { 
      for (int j = 0; j < bitmap.Height; j++) 
      { 
       bitmap.SetPixel(i, j, (Math.Abs(i - j) < 2) ? Color.Blue : Color.Yellow); 
      } 
     } 
     MemoryStream ms = new MemoryStream(); 
     bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
     ms.Position = 0; 
     WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg"; 
     return ms; 
    } 
} 

मेरी मेजबान आवेदन में:

Operation 'GetImage' in contract 'IReceiveData' uses GET, but also has body parameter 'width'. GET operations cannot have a body. Either make the parameter 'width' a UriTemplate parameter, or switch from WebGetAttribute to WebInvokeAttribute.

इम यकीन नहीं:

class Program 
    { 
     static void Main(string[] args) 
     { 
      string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
      ServiceHost host = new ServiceHost(typeof(RawDataService), new Uri(baseAddress)); 
      host.AddServiceEndpoint(typeof(IReceiveData), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior()); 
      host.Open(); // this line 
      Console.WriteLine("Host opened"); 
      Console.ReadLine(); 

मैं इस त्रुटि मिलती है आप किसी छवि के लिए webinvoke/UriTemplate विधि कैसे सेट करते हैं या आप कैसे छवि प्राप्त करते हैं और इसे वापस करते हैं। क्या कोई इस उदाहरण में एक छवि प्रदर्शित करने के लिए सही तरीका पोस्ट कर सकता है।

संपादित

अगर मैं नीचे इस सवाल का जवाब कोशिश करते हैं और मेरी UriTemplate रूप UriTemplate = "picture?w={width}&h={height}" का उपयोग करते हैं http://www.localhost.com:8000/Service/picture?width=50&height=40 पर नेविगेट करके मैं अपने कोड में कोई त्रुटि प्राप्त:

public Stream GetImage(int width, int height) 
     { 
      Bitmap bitmap = new Bitmap(width, height); // this line 
      for (int i = 0; i < bitmap.Width; i++) 
      { 
       for (int j = 0; j < bitmap.Height; j++) 
       { 
        bitmap.SetPixel(i, j, (Math.Abs(i - j) < 2) ? Color.Blue : Color.Yellow); 
       } 
      } 
      MemoryStream ms = new MemoryStream(); 
      bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
      ms.Position = 0; 
      WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg"; 
      return ms; 
     } 

कहा गया है कौन सा ArguementException was unhandled by user code:पैरामीटर मान्य नहीं है ।

उत्तर

11

विशेषताओं में, आपको उस रनटाइम को बताने की आवश्यकता है जिसे आप चौड़ाई और ऊंचाई को URL पैरामीटर के रूप में उम्मीद कर रहे हैं।

फिलहाल, रनटाइम मानता है कि आप पैरामीटर के बिना यूआरएल को बुला रहे हैं, लेकिन विधि को पैरामीटर की उम्मीद कहा जा रहा है, इसलिए रनटाइम वास्तव में नहीं जानता कि width के लिए अपनी विधि को पास करने के लिए मान कैसे प्राप्त करें और height

इस तरह

[WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "picture/{width}/{height}")] 
Stream GetImage(string width, string height) 
{ 
    int w, h; 
    if (!Int32.TryParse(width, out w)) 
    { 
     // Handle error: use default values 
     w = 640; 
    } 
    if (!Int32.TryParse(height, out h)) 
    { 
     // Handle error use default values 
     h = 480; 
    } 

    .... 
} 

देख सकते हैं और आप http://test.tld/picture/320/200 तरह URL को कॉल करने की आवश्यकता होगी।

+0

आपकी विधि वापस आती है: 'ऑपरेशन' GetImage 'अनुबंध' IReceiveData 'में' चौड़ाई 'नामक एक पथ चर है जिसमें टाइप' स्ट्रिंग 'नहीं है। UriTemplate पथ खंडों के लिए वेरिएबल्स में 'string' टाइप होना चाहिए। –

+1

आप सही हैं, मैं 'int' को 'स्ट्रिंग' में बदलना भूल गया। एक यूआरएल में कोई अवधारणा नहीं है कि पैरामीटर एक 'int' या' स्ट्रिंग 'है, इसलिए सब कुछ' स्ट्रिंग 'के रूप में पास किया गया है और आपको तदनुसार अपने कोड में मानों को सत्यापित और डालने की आवश्यकता है। वैसे भी, मेरा समाधान सही उत्तर है, क्योंकि मेरे पास यह भी मेरे अनुप्रयोगों में से एक में चल रहा है :- डी –

+0

ठीक है, मैं यह स्पष्ट करने के लिए फिर से अपना उत्तर अपडेट करूंगा कि * निश्चित रूप से * रेखा '// हैंडल त्रुटि त्रुटि को संभालने के लिए कुछ कोड द्वारा प्रतिस्थापित किया जाना चाहिए ... –

9
UriTemplate = "picture/" 

होना चाहिए

की तरह कुछ
UriTemplate = "picture?w={width}&h={height}" 

यह WCF बताता है कि कैसे URL से चौड़ाई और ऊंचाई मापदंडों मिलता है।

+0

यह चलता है लेकिन जब मैं 'http: // localhost: 8000/सेवा/चित्र? चौड़ाई = 50 और ऊंचाई = 40' पर नेविगेट करने का प्रयास करता हूं तो मुझे इस पंक्ति पर एक त्रुटि मिलती है:' बिटमैप बिटमैप = नया बिटमैप (चौड़ाई, ऊंचाई); ' जो कहता है ** पैरामीटर वैध नहीं है। ** –

+1

और यह भी इसलिए है क्योंकि '{width}' और '{height}' तार हैं और आपकी विधि 'int' की अपेक्षा करती है। नीचे दिए गए मेरे समाधान का उपयोग करें और आप देखेंगे कि ए) यूआरएल बार्ग की तुलना में क्लीनर दिखते हैं और बी) स्ट्रिंग्स को 'int' पर कास्टिंग करने के बाद चीजें काम करती हैं। –

+0

यह भी सावधान रहें कि आप यूआरएल और यूरी टेम्पलेट के बीच सुसंगत हैं। UriTemplate के ऊपर 'w' और 'h' नामक दो पैरामीटर निर्दिष्ट करते हैं लेकिन आपका यूआरएल 'चौड़ाई' और 'ऊंचाई' नामक पैरामीटर प्रदान करता है। सही यूआरएल होगा: http: // localhost: 8000/सेवा/चित्र? W = 50 और एच = 40 – Opsimath

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