2017-02-19 6 views
8

ServiceHost.AddServiceEndpoint का उपयोग करते समय कस्टम जोड़ने के लिए ProtoEndpointBehavior मैं निम्न अपवाद प्राप्त करें:AddServiceEndpoint फेंकता कुंजी शून्य है?

System.ArgumentNullException: मान रिक्त नहीं हो सकता है। पैरामीटर नाम: System.ServiceModel.ServiceHostBase.ImplementedContractsContractResolver.ResolveContract System.ServiceModel.ServiceHostBase.ServiceAndBehaviorsContractResolver.ResolveContract पर (स्ट्रिंग contractName) पर System.Collections.Generic.Dictionary 2.FindEntry(TKey key) at System.Collections.Generic.Dictionary 2.ContainsKey (TKey कुंजी) (स्ट्रिंग पर कुंजी System.ServiceModel.ServiceHostBase.AddServiceEndpoint पर System.ServiceModel.Description.ConfigLoader.LookupContractForStandardEndpoint (स्ट्रिंग contractName, स्ट्रिंग SERVICENAME) System.ServiceModel.Description.ConfigLoader.LookupContract (स्ट्रिंग contractName, स्ट्रिंग SERVICENAME) पर पर contractName) (ServiceEndpoint एंडपोई सी में My.Service.Business.ServiceHandler.StartService (प्रकार ServiceType, स्ट्रिंग uri, SecureConnectionSettings secureConnectionSettings) पर NT): \ मेरे \ उत्पादों के \ मेरे Utveckling \ समाधान \ My.Service.Business \ ServiceHandler.cs: रेखा

ServiceHost serviceHost = null; 
Console.WriteLine("Creating service " + serviceType.FullName); 
serviceHost = new MyServiceHost(serviceType, new Uri(uri)); 

var endPointAddress = ""; 

HttpBindingBase binding = null; 
if (secureConnectionSettings != null && secureConnectionSettings.Enabled) 
{ 
    Console.WriteLine("Setting certificates"); 
    X509Store store = new X509Store(secureConnectionSettings.CertificateStore, secureConnectionSettings.CertificateLocation); 
    store.Open(OpenFlags.ReadOnly); 
    X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindByThumbprint, secureConnectionSettings.Thumbprint, true); 
    store.Close(); 

    if (certs.Count > 0) 
     serviceHost.Credentials.ServiceCertificate.SetCertificate(secureConnectionSettings.CertificateLocation, 
                   secureConnectionSettings.CertificateStore, 
                   X509FindType.FindByThumbprint, 
                   secureConnectionSettings.Thumbprint); 
    else 
     throw new Exception("Could not finde certificate with thumbprint " + secureConnectionSettings.Thumbprint); 

    endPointAddress = uri + "/BinaryHttpsProto"; 
    binding = CreateNetHttpsBinding(secureConnectionSettings); 
} 
else 
{ 
    endPointAddress = uri + "/BinaryHttpProto"; 
    binding = CreateNetHttpBinding(); 
} 

var endpoint = new System.ServiceModel.Description.ServiceEndpoint(new System.ServiceModel.Description.ContractDescription(typeof(IMyClientService).FullName), 
    binding, 
    new EndpointAddress(endPointAddress)); 

endpoint.EndpointBehaviors.Add(new ProtoBuf.ServiceModel.ProtoEndpointBehavior()); 
serviceHost.AddServiceEndpoint(endpoint); 

Console.WriteLine("Starting service..."); 
serviceHost.Open(); 
Console.WriteLine("Service started successfully (" + uri + ")"); 
return serviceHost; 

मैं इस तरह कॉन्फ़िग फ़ाइल में इस सेट करने के लिए उपयोग करें:: 150

इस तरह कैसे कोड दिखता है

<endpointBehaviors> 
    <behavior name="protoEndpointBehavior"> 
     <protobuf /> 
    </behavior> 
    </endpointBehaviors> 

अब मुझे इसे कोड में जोड़ने की जरूरत है।

क्या गलत है?

+0

आपके द्वारा पोस्ट किए गए कोड में कौन सी पंक्ति उस त्रुटि को फेंक रही है? – Sparrow

+0

@FeryalBadili इसे एंडपॉइंट पर फेंक दिया गया है। एंडपॉइंटबैवियर्स। पंक्ति जोड़ें। – Banshee

उत्तर

4

यह known bug है और इसके लिए कामकाज है।

var endpoint = new System.ServiceModel.Description.ServiceEndpoint(System.ServiceModel.Description.ContractDescription.GetContract(typeof(IMyClientService)), 
    binding, 
    new EndpointAddress(endPointAddress)); 

मैं आपकी समस्या को पुन: पेश करने में सक्षम था और इस समाधान मेरे लिए काम किया:

जब ContractDescription के कहने प्राप्त करने, स्थिर विधि ContractDescription.GetContract(Type) बजाय प्रत्यक्ष ContractDescription() निर्माता का उपयोग करें।

1

कारण आप अपवाद क्यों देख रहे हैं क्योंकि ServiceEndpoint माना जाता है कि आप कॉन्फ़िगरेशन फ़ाइल का उपयोग करते हैं। यह & को पुनर्प्राप्त करने का प्रयास कर रहा है, जो आपके अनुबंध, बाध्यकारी और पते को हल करता है जो मौजूद नहीं है क्योंकि आप कॉन्फ़िगरेशन फ़ाइल का उपयोग नहीं कर रहे हैं।

ServiceEndpoint (टिप्पणी देखें) इस निर्माता जब बंधन और अंत बिंदु हैं विन्यास में उपलब्ध कराई गई के लिए पता

का प्रयोग करें।

तरीके की संख्या create or retrieve a ContractDescription वस्तु के लिए कर रहे हैं: क्या तुम सच में ContractDescription बनाने के लिए जोर देते हैं, तो

var contractUsingName = new ContractDescription("IProtoBufService"); 
var contractUsingNameWithNameSpace = new ContractDescription("IProtoBufService", "http://www.tempuri.org"); 
var contractUsingContractType = ContractDescription.GetContract(typeof(IProtoBufService)); 
var contractUsingContractTypeAndObjectImp = ContractDescription.GetContract(typeof(IProtoBufService), ProtoBufService); 
var contractUsingContractTypeAndObjectType = ContractDescription.GetContract(typeof(IProtoBufService), typeof(ProtoBufService)); 

प्रोग्राम के रूप में आप निम्न में से कुछ निर्धारित करने होंगे:

  • ContractDescription
  • OperationDescription
  • संदेश डिस्क्रिप्शन
  • OperationBehaviorAttribute
  • और अन्य सामान ...

या आप इस blog एक किकर के रूप में पालन कर सकते हैं।

क्या आपने कोडफूलर के उत्तर की कोशिश की है? उसका जवाब आपके जीवन को आसान बना सकता है। मैंने एक त्वरित जांच की और यह काम करता है।

class Program 
{ 
    static void Main() 
    { 
     var baseAddress = new Uri("http://localhost:8080/ProtoBuf"); 

     using (var serviceHost = new ServiceHost(typeof(ProtoBufService), baseAddress)) 
     { 
      var endpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(IProtoBufService)), 
       new NetHttpBinding(), 
       new EndpointAddress(baseAddress)); 

      endpoint.EndpointBehaviors.Add(new ProtoEndpointBehavior()); 
      serviceHost.AddServiceEndpoint(endpoint); 

      serviceHost.Open(); 
      Console.ReadKey(); 
     } 
    } 
} 

दुर्भाग्य से, मैं एक छवि "कुछ imgur साथ कुछ गड़बड़ है" संलग्न नहीं कर सकता है, लेकिन यह अपने वेब ब्राउज़र पर काम करते हैं। हालांकि मैंने क्लाइंट ऐप का उपयोग करके परीक्षण नहीं किया है, लेकिन मुझे लगता है कि आप पहले से ही समाधान के करीब हैं।

युक्ति: कॉन्फ़िगरेशन फ़ाइल और कोड मिश्रण न करें क्योंकि इसे बनाए रखना बहुत मुश्किल है। "जिसे आप शायद जानते थे" शुभकामनाएं :)

+0

धन्यवाद! हां कोडफुलर समस्या को हल करने लगता है लेकिन मैं अभी भी जांच रहा हूं कि यह वास्तव में हल हो गया है या नहीं। – Banshee

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