2013-02-13 53 views
9

में जेसन प्रतिक्रिया सामग्री प्रकार को गतिशील रूप से असाइन करना मैं एक पीओसी एप्लीकेशन लिख रहा हूं जो Microsoft.ServiceBus.dll 1.0.0.0 (.NET 3.5 संस्करण) का उपयोग करता है।डब्ल्यूसीएफ एज़ूर सर्विस बस

मेरे WCF अनुबंध और निम्नलिखित की तरह सेवा नज़र:

  • SECURITYMODE:: परिवहन
  • TransferMode: स्ट्रीम किया

[ServiceContract(Name="MyServiceContract", Namespace = "http://mydomain.com/")] 
internal interface IServiceContract 
{ 
    [WebInvoke(Method = "POST", UriTemplate = "/DoOperation")] 
    [OperationContract] 
    Stream RelayRequest(Stream requestBody); 
} 

[ServiceBehavior(Name = "Service1", Namespace = "http://mydomain.com/Service1/", InstanceContextMode = InstanceContextMode.Single)] 
internal class Service1 : IServiceContract 
{ 
    Stream RelayRequest(Stream requestBody) 
    { 
     var contents = GetJsonResponse(); 
     var responseStream = new MemoryStream(); 
     var streamWriter = new StreamWriter(responseStream); 
     streamWriter.AutoFlush = true; 
     var writer = new JsonTextWriter(streamWriter); 
     var serializer = new JsonSerializer(); 
     serializer.Serialize(responseStream, contents); 

     responseStream.Position = 0 // reset the position of the stream so that it's contents will be read from the beginning. 

     //Problem Line: 
     WebOperationContext.OutgoingResponse.ContentType = "application/json"; 
     return responseStream; 
    } 
} 

सुनने के अंत बिंदु WebHttpRelayBinding उपयोग करने के लिए कॉन्फ़िगर किया गया है

जब मैं असाइन करने का प्रयास करता हूं "एप्लिकेशन/जेसन" के आउटगोइंग प्रतिक्रिया का ContentType कोई त्रुटि नहीं होती है लेकिन कॉलिंग अनुरोध स्थिति कोड 504 (गेटवे टाइमआउट) के साथ आता है।

यदि मैं सामग्री प्रकार को "टेक्स्ट/जावास्क्रिप्ट" में बदलता हूं तो कॉलिंग अनुरोध 200 (ठीक) के साथ आता है।

कुछ बातें ध्यान रखें:

  • सामग्री प्रकार रन समय तक ज्ञात नहीं है तो यह गतिशील रूप से आवंटित किया जाना चाहिए।
  • स्ट्रीम की सामग्री शुद्ध है - 100% मान्य - जेसन।
  • स्ट्रीम स्वीकार करने और वापस करने का इरादा इसलिए है कि हम स्ट्रीम किए गए अनुरोध स्वीकार कर सकते हैं और डेटा को क्लाइंट को स्ट्रीम कर सकते हैं।
    • प्रत्येक अनुरोध/प्रतिक्रिया में एक छोटा जेसन पेलोड या 200 एमबी दस्तावेज़ हो सकता है।
  • यदि आप repro करना चाहते हैं - यह कोड serialization के लिए न्यूटॉन्सॉफ्ट जेसन लाइब्रेरी का उपयोग करता है।

यह क्यों हो रहा है और मैं इसे कैसे ठीक कर सकता हूं?

संपादित करें: 504 स्टेटस कोड फिडलर द्वारा अनुमानित लाल हेरिंग हो सकता है जिसके साथ मैं परीक्षण कर रहा हूं। System.Net.Http.HttpClient से एक ही अनुरोध भेजना इंगित करता है कि प्रतिक्रिया प्राप्त होने से पहले कनेक्शन बंद हो जाता है।

संपादित करें: सामग्री-प्रकार को बहुत कुछ और (गैर-संवेदी मानों सहित) में सेट करना ठीक काम करता है। एकमात्र सामग्री प्रकार जिसे मैं इसे तोड़ने के लिए प्राप्त कर सकता हूं वह एप्लिकेशन/जेसन

+0

आप अपने config फ़ाइल से जानकारी जोड़ सकते हैं/कैसे आप इस सेवा को आरंभ? आप किस प्रकार के बाध्यकारी का उपयोग कर रहे हैं? – TheDude

+0

ऊपर बताए गए अनुसार हम WebHttpRelay बाइंडिंग का उपयोग करते हैं। यह बाध्यकारी/अंत बिंदु कॉन्फ़िगर द्वारा नहीं बनाया गया है, यह रनटाइम पर प्रोग्रामेटिक रूप से बनाया गया है। –

+0

आह, अनुमान है कि आपके पास मानसिक विवरणों की एक श्रृंखला थी जो आपके विवरण को पढ़ रही है ... – TheDude

उत्तर

-1

इस तरह मैंने इसे काम किया है, लेकिन यह आईआईएस में स्थानीय रूप से होस्ट की गई एक साधारण डब्ल्यूसीएफ सेवा है। मैं माइक्रोसॉफ्ट.ServiceBus या Azure का उपयोग नहीं करता।

पहला फिडलर की प्रतिक्रिया।

namespace yourNS 
{ 
    [ServiceContract] 
    public interface IService1 
    { 
     [OperationContract] 
     [WebGet(UriTemplate = "/CT", ResponseFormat = WebMessageFormat.Json)] 
     List<CompositeType> GetData(); 
    } 


    [DataContract] 
    public class CompositeType 
    { 
     [DataMember] 
     public bool BoolValue { get; set; } 

     [DataMember] 
     public string StringValue { get; set; } 
    } 

    public class Service1 : IService1 
    { 
     public List<CompositeType> GetData() 
     { 
      return new List<CompositeType> 
      { 
       new CompositeType { BoolValue = true, StringValue = "blah" }, 
       new CompositeType { BoolValue = false, StringValue = "boo" }, 
       new CompositeType { BoolValue = true, StringValue = "floo" }, 
      }; 
     } 
    } 
} 

और वेब: यदि यह आप क्या देख रहे तो कोड के लिए आगे बढ़ना के लिए :)

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Length: 121 
Content-Type: application/json; charset=utf-8 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Thu, 04 Apr 2013 17:17:05 GMT 

[{"BoolValue":true,"StringValue":"blah"},{"BoolValue":false,"StringValue":"boo"},{"BoolValue":true,"StringValue":"floo"}] 

सेवा परिभाषा है।config

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <services> 
     <service name="yourNS.Service1"> 
     <endpoint 
      address="" 
      binding="webHttpBinding" 
      behaviorConfiguration="MyBehave" 
      contract="yourNS.IService1" /> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="MyBehave"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 
+0

आपका समाधान केवल तभी काम करता है क्योंकि आपने मूल प्रश्न से सभी जटिलताओं को हटा दिया है जो समस्या को पहली जगह में पैदा कर रहा था। जैसा कि मूल प्रश्न में बताया गया है, मुझे प्रतिक्रिया सामग्री प्रकार को गतिशील रूप से असाइन करने की आवश्यकता है, मुझे इसे प्राप्त करने के लिए Azure Service Bus का उपयोग करने की भी आवश्यकता है। –