2010-06-15 27 views
5

अपवाद "यह कार्रवाई एक सापेक्ष URI लिए समर्थित नहीं है।" निम्न स्थिति में होता है:अजीब अपवाद है जब एक प्रॉक्सी सर्वर के माध्यम से एक WCF सेवा से कनेक्ट करने

:

मैं एक WCF सेवा है

[ServiceContract(ProtectionLevel=ProtectionLevel.None)] 
public interface IMyService 
{ 
    [OperationContract] 
    [FaultContract(typeof(MyFault))] 
    List<MyDto> MyOperation(int param); 

    // other operations 
} 

public class MyService : IMyService 
{ 
    public List<MyDto> MyOperation(int param) 
    { 
     // Do the business stuff and return a list of MyDto 
    } 

    // other implementations 
} 

MyFault और MyDto दो बहुत ही सरल [DataContract] विशेषता के साथ चिह्नित कक्षाएं हैं और प्रत्येक केवल प्रकार string, int and int? के तीन [DataMember] रही है।

यह सेवा एक आईएसपी 7.0 में एक एएसपी.NET अनुप्रयोग के साथ एक विन 2008 सर्वर पर होस्ट की गई है। मैं एक एसवीसी फ़ाइल MyService.svc का उपयोग कर रहा हूं जो सीधे वेब साइट की जड़ में स्थित है। web.config में सेवा विन्यास है निम्नलिखित:

<system.serviceModel> 
    <services> 
    <service name="MyServiceLib.MyService"> 
     <endpoint address="" binding="wsHttpBinding" 
      bindingConfiguration="wsHttpBindingConfig" 
      contract="MyServiceLib.IMyService" /> 
    </service> 
    </services> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="wsHttpBindingConfig"> 
     <security mode="None"> 
      <transport clientCredentialType="None" /> 
     </security> 
     </binding> 
    </wsHttpBinding> 
    </bindings> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior> 
     <serviceMetadata httpGetEnabled="false"/> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

इस रूप में मैं एक ब्राउज़र में पता http://www.domain.com/MyService.svc दर्ज करें और प्राप्त कर सकते हैं अब तक काम करने के लिए लगता है -आपका पेज "यह एक Windows संचार फाउंडेशन सेवा है।"

MyServiceClient aChannel = new MyServiceClient("WSHttpBinding_IMyService"); 
List<MyDto> aMyDtoList = aChannel.MyOperation(1); 

यह निम्न विन्यास है:

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="WSHttpBinding_IMyService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="true" transactionFlow="false" 
      hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="false" 
      proxyAddress="10.20.30.40:8080" allowCookies="false"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" 
       maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" 
       enabled="false" /> 
      <security mode="None"> 
      <transport clientCredentialType="Windows" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="Windows" 
       negotiateServiceCredential="true" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://www.domain.com/MyService.svc" binding="wsHttpBinding" 
      bindingConfiguration="WSHttpBinding_IMyService" 
      contract="MyService.IMyService" 
      name="WSHttpBinding_IMyService" /> 
    </client> 
</system.serviceModel> 

जब मैं एक ग्राहक स्थल पर एक उत्पादन सर्वर पर इस एप्लिकेशन को चलाने बुला

ग्राहकों सेवा लेने वाली से एक एक सांत्वना अनुप्रयोग है aChannel.MyOperation(1) निम्नलिखित अपवाद फेंकता है:

यह ऑपरेशन किसी रिश्तेदार यूआरआई के लिए समर्थित नहीं है।

जब मैं बिल्कुल वैसा ही config, अपवाद है कि मैं बाइंडिंग आपरेशन समस्याओं के बिना काम करता है से proxyAddress="10.20.30.40:8080" हटाने के साथ के साथ अपने विकास पीसी पर इस क्लाइंट अनुप्रयोग चलाते हैं।

अब मुझे वास्तव में पता नहीं है कि प्रॉक्सी सर्वर पते को निर्दिष्ट करने के लिए पूर्ण या सापेक्ष यूआरआई के साथ क्या करना पड़ सकता है। प्रॉक्सी सर्वर का उपयोग या नहीं, केवल एक ही अंतर है जिसे मैं क्लाइंट को उत्पादन या विकास मशीन पर चलाते समय देख सकता हूं।

क्या किसी को यह पता है कि इस संदर्भ में इस अपवाद का क्या अर्थ हो सकता है और समस्या को हल करने के लिए संभवतः क्या हो सकता है?

मदद के लिए अग्रिम धन्यवाद!

संपादित करें:

मामले में यह महत्वपूर्ण होना चाहिए: सेवा और ग्राहक .NET फ्रेमवर्क 4 में WCF के साथ बनाया जाता है।

उत्तर

8

10.20.30.40:8080 एक वैध यूआरएल नहीं है। आप http://10.20.30.40:8080 चाहते हैं।


यहाँ मेरी नैदानिक ​​विचार प्रक्रिया है, के मामले में यह किसी को भी मदद करता है:

  1. अपवाद आमतौर पर झूठ मत बोलो। वे आमतौर पर वही कहते हैं जो वे कहते हैं। चाल यह समझना है कि वे संभवतः सत्य कैसे कह सकते हैं।
  2. अपवाद ने कहा, "यह ऑपरेशन किसी रिश्तेदार यूआरआई के लिए समर्थित नहीं है"। यदि यह सच था, तो इसका मतलब था कि एक ऑपरेशन किया जा रहा था, इसे एक सापेक्ष यूआरएल दिया जा रहा था, लेकिन यह सापेक्ष यूआरआई का समर्थन नहीं करता है।
  3. ओपी ने तब कहा कि जब वह "अपवाद के साथ" मैं प्रॉक्सी एड्रेस = "10.20.30.40:8080" बाइंडिंग से "एप्लिकेशन को चलाता हूं"।

वहां, मेरे सामने, एक सापेक्ष यूआरआई था। जब उसने इसे हटा दिया, तो "ऑपरेशन" काम करता था, इसलिए मैंने यह अनुमान लगाया कि यह सापेक्ष यूआरआई था जिसे "ऑपरेशन" को आपूर्ति की गई थी जो उनका समर्थन नहीं करती है।

आपको इसे हल करने के लिए बिल्कुल शेरलॉक होम्स नहीं होना चाहिए। कुंजी तुरंत यह देखने में सक्षम थी कि यूआरआई के सामने कोई scheme:// नहीं था, जिससे यह सापेक्ष बना।

+0

वाह! एक हजार पेज लंबे सवाल, उत्तर की एक पंक्ति और आप नाखून मारा। जवाब के रूप में चिह्नित, परीक्षण, काम करता है। मैं शर्म में छिपा हुआ हूँ। वैसे भी: अच्छा मैंने पूछा। आपका बहुत बहुत धन्यवाद! (संपादित करें: लॉल, "आप 2 मिनट में एक जवाब स्वीकार कर सकते हैं", आप बहुत तेज़ थे। अब 2 मिनट प्रतीक्षा कर रहे हैं ...) – Slauma

+1

स्लुमा, यह बहुत अच्छा है कि आपने पूछा है!)) क्योंकि मैं बहुत ही समान स्थिति में पकड़ा गया था। प्रॉक्सी यूआरएल का इस्तेमाल मेरे मामले में "http: //" के बिना क्यों किया गया था, यह है कि इसे किसी अन्य स्थान से कॉपी किया गया था (wget.exe पर पैरामीटर) जहां यह एक वैध वाक्यविन्यास था। – Ivan

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