2011-01-19 15 views
5

पर आईओसी समर्थन जोड़ने की कोशिश कर रहा हूं, मैं अपनी आरईएसटी डब्ल्यूसीएफ सेवा (विंडोज सर्वर 2008) में आईओसी समर्थन जोड़ने की कोशिश कर रहा हूं। मैं इस के लिए नया हूँ और नीचे दिए गए वीडियो में दिए गए निर्देशों का अनुसरण कर रही हूं:मेरी डब्ल्यूसीएफ सेवाओं

http://www.dimecasts.net/Content/WatchEpisode/150

वीडियो कक्षाएं, जिनकी सहायता से StructureMap के आईओसी ऊपर और WCF अंतिम बिंदुओं को उजागर करते हुए चलाने के के एक नंबर के माध्यम से चलता है। मैंने इस पोस्ट के अंत में सभी कोड पोस्ट कर दिए हैं।

जब मैं अपने कोड चलाने के लिए, कस्टम वर्ग StructureMapServiceHost एक त्रुटि @ StructureMapServiceHost फेंकता (प्रकार ServiceType, पैरामीटर उरी [] baseAddress) विधि:

public class StructureMapServiceHost : ServiceHost 
{ 
    public StructureMapServiceHost() {} 

    public StructureMapServiceHost(Type serviceType, params Uri[] baseAddress) 
     : base(serviceType, baseAddress) 
    { 

    } 

    protected override void OnOpening() 
    { 
     Description.Behaviors.Add(new IoCServiceBehavior()); 
     base.OnOpening(); 
    } 
} 

मुझे बताया जा रहा है कि:

प्रदान की गई सेवा प्रकार को सेवा के रूप में लोड नहीं किया जा सका क्योंकि इसमें डिफ़ॉल्ट (पैरामीटर-कम) कन्स्ट्रक्टर नहीं है। समस्या को ठीक करने के लिए, प्रकार के लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर जोड़ें, या मेजबान के प्रकार का उदाहरण पास करें।

यह सच है, ऐसा नहीं है। लेकिन वीडियो उदाहरण में एक भी नहीं था। नीचे मेरी सेवा है:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] 
    public class UserService : IUserService 
    { 
     public UserService(IUserRepository specification) 
     { 
      Specification = specification; 
     } 

     public List<User> GetAllUsers() 
     { 
      return Specification.GetAllUsers(); 
     } 

     public User GetUser(string userId) 
     { 
      return Specification.GetUserById(new Guid(userId)); 
     } 

     private List<User> SearchForUsers(string searchString) 
     { 
      return Specification.SearchUsers(searchString); 
     } 

     public IUserRepository Specification { get; set; } 

    } 



public class IoCServiceBehavior : IServiceBehavior 
    { 
     public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
     { 
     } 

     public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, 
      Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) 
     { 
     } 

     public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
     { 
      foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers) 
      { 
       new StructureMapInstanceProvider(serviceDescription.ServiceType); 
      } 
     } 
    } 


public class StructureMapInstanceProvider : IInstanceProvider 
{ 
    private readonly Type _serviceType; 

    public StructureMapInstanceProvider(Type serviceType) 
    { 
     _serviceType = serviceType; 
    } 

    public object GetInstance(InstanceContext instanceContext) 
    { 
     return GetInstance(instanceContext, null); 
    } 

    public object GetInstance(InstanceContext instanceContext, Message message) 
    { 
     var instance = ObjectFactory.GetInstance(_serviceType); 

     return instance; 
    } 

    public void ReleaseInstance(InstanceContext instanceContext, object instance) 
    { 
     throw new NotImplementedException(); 
    } 
} 




public class StructureMapServiceHostFactory : ServiceHostFactory 
    { 
     public StructureMapServiceHostFactory() 
     { 
      IoCBootstrap.SetupIoc(); 
     } 

     protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
     { 
      return new StructureMapServiceHost(serviceType, baseAddresses); 
     } 
    } 

कोई विचार? धन्यवाद।

संपादित * ** * ** * ** * ** * ** * ** * ** * ** * * * * ****

संरचना से ChromeServiceHost मैंने हटा दिया:

public StructureMapServiceHost(Type serviceType, params Uri[] baseAddress) 
      : base(serviceType, baseAddress) { } 

और कहा:

public StructureMapServiceHost(Object singletonInstance, params Uri[] baseAddress) 
      : base(singletonInstance, baseAddress) { } 

और फिर मेरी UserService निर्माता से पैरामीटर हटा दिया। मैं त्रुटि नहीं मिल रहा है:

The HTML document does not contain Web service discovery information.

उत्तर

0

मैं अभी (इंटरनेट सीमाओं) वीडियो पर एक नज़र नहीं ले जा सकते हैं, लेकिन मैं यकीन है कि उनके उदाहरण में वर्ग किसी भी निर्माता नहीं था पर हूँ सभी। और उस स्थिति में, संकलक आपकी ओर से एक खाली पैरामीटर रहित कन्स्ट्रक्टर उत्पन्न करता है। इसलिए, उनकी कक्षा के बाद एक डिफ़ॉल्ट कन्स्ट्रक्टर है।

जहाँ तक अपवाद, कि बिल्कुल स्पष्ट लगता है के रूप में: अपने parameterless निर्माता Specification संपत्ति को प्रारंभ नहीं होता है, तो वह हमेशा null है - जो, स्वाभाविक रूप से, एक NullReferenceException का कारण बनता है एक बार आप अपने तरीकों में यह तक पहुँचने का प्रयास।

ऐसा लगता है कि आप यहां क्या चाहते हैं UserService स्वयं को ऑब्जेक्ट बनाना और IUserRepository को पास करना है, है ना?

उस मामले में (या, शायद, उस के लिए अपने आईओसी ढांचे का उपयोग?), तो आप बेहतर ServiceHost के निर्माता का अधिभार है कि एक object बजाय Type लेता है का उपयोग करेंगे। इस तरह, आपके UserService ऑब्जेक्ट पर आपका पूरा नियंत्रण होगा, और आपको डिफ़ॉल्ट डिज़ाइनर की आवश्यकता नहीं होगी।

+0

धन्यवाद फ्योदोर। मैंने आपके सुझावों का प्रयास किया है और एक नई त्रुटि मिली है। कृपया उपरोक्त मेरा ईडीआईटी देखें। क्या आप मुझे बता सकते हैं कि मैं क्या गलत कर रहा हूं? कोड चित्रण इस बिंदु पर मदद कर सकता है ... बहुत सराहना की। –

+0

@ कोड शेरपा: अपने ब्राउज़र के साथ उस सेवा तक पहुंचने का प्रयास करें और देखें कि यह आपको कौन सी त्रुटि देता है। –

+0

हाय फ़िडोर - मुझे मिल रहा है: संसाधन नहीं मिला। विवरण: HTTP 404. जिस संसाधन को आप ढूंढ रहे हैं (या इसकी निर्भरताओं में से एक) को हटा दिया जा सकता था, इसका नाम बदल गया था, या अस्थायी रूप से अनुपलब्ध है। कृपया निम्नलिखित यूआरएल की समीक्षा करें और सुनिश्चित करें कि यह सही वर्तनी है। अनुरोधित यूआरएल: /Users.svc/users –

17

आपकी सेवा का उपयोग करता है InstanceContextMode.SingleCall और WCF टीम अपने अनंत ज्ञान में फैसला किया है, यह है कि जब InstanceContextMode है SingleCall IInstanceProvider उदाहरण बनाने के लिए लागू नहीं है (देखें http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/31/wcf-extensibility-iinstanceprovider.aspx - इंटरफ़ेस declration शीर्षक के नीचे दूसरे पैरा)।

Currrently मैं सेवा मेजबान कारखाने में है कि चारों ओर होने का आदर्श तरीका तुलना में एक कम है:

using System; 
using System.Collections.Generic; 
using System.ServiceModel; 
using System.ServiceModel.Activation; 
using StructureMap; 
using StructureMap.Pipeline; 
using System.Linq; 

using ServiceHostCreator = System.Func<System.Type, System.Uri[], System.ServiceModel.ServiceHost>; 

namespace x.ServiceExtensions 
{ 
    public class xWebServiceHostFactory : ServiceHostFactory 
    { 
     private readonly IDictionary<InstanceContextMode, ServiceHostCreator> _serviceHostCreators; 

     public xWebServiceHostFactory() 
     { 
      ObjectFactory.Initialize(init => 
             init.Scan(scan => 
                { 
                 scan.AssembliesFromApplicationBaseDirectory(); 
                 scan.IgnoreStructureMapAttributes(); 
                 scan.LookForRegistries(); 
                })); 
      _serviceHostCreators = new Dictionary<InstanceContextMode, ServiceHostCreator> 
             { 
              { InstanceContextMode.PerCall, (t, a) => PerCallServiceHostCreator(t, a) }, 
              { InstanceContextMode.PerSession, (t, a) => PerSessionServiceHostCreator(t, a) }, 
              { InstanceContextMode.Single, (t, a) => SingleInstanceServiceHostCreator(t, a) } 
             }; 
     } 

     protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
     { 
      var serviceInstanceContextMode = GetServiceInstanceContextMode(serviceType); 
      var serviceHostCreator = _serviceHostCreators[ serviceInstanceContextMode ]; 
      return serviceHostCreator(serviceType, baseAddresses); 
     } 

     private static InstanceContextMode GetServiceInstanceContextMode(Type serviceType) 
     { 
      var serviceBehaviour = serviceType 
       .GetCustomAttributes(typeof (ServiceBehaviorAttribute), true) 
       .Cast<ServiceBehaviorAttribute>() 
       .SingleOrDefault(); 
      return serviceBehaviour.InstanceContextMode; 
     } 

     private static ServiceHost PerCallServiceHostCreator(Type serviceType, Uri[] baseAddresses) 
     { 
      var args = new ExplicitArguments(); 
      args.Set(serviceType); 
      args.Set(baseAddresses); 
      var serviceHost = ObjectFactory.GetInstance<TelaWebServiceHost>(args); 
      return serviceHost; 
     } 

     private static ServiceHost PerSessionServiceHostCreator(Type serviceType, Uri[] baseAddresses) 
     { 
      return PerCallServiceHostCreator(serviceType, baseAddresses); 
     } 

     private static ServiceHost SingleInstanceServiceHostCreator(Type serviceType, Uri[] baseAddresses) 
     { 
      var service = ObjectFactory.GetInstance(serviceType); 
      var args = new ExplicitArguments(); 
      args.Set(typeof(object), service); 
      args.Set(baseAddresses); 
      var serviceHost = ObjectFactory.GetInstance<TelaWebServiceHost>(args); 
      return serviceHost; 
     } 
    } 
} 

इस पर कार्य चल रहा है और एक बेहतर तरीका हो सकता है, लेकिन इस समय मैं कर सकते हैं ' एक नहीं मिला।

+1

InstanceContextMode के बारे में अत्यधिक प्रासंगिक जानकारी का उल्लेख करने के लिए धन्यवाद, मुझे दुःख का कोई अंत नहीं हुआ और मैंने जो भी लेख पढ़ा था, उसका कोई भी उल्लेख नहीं किया। मैं उस मामले में विश्वास करता हूं जहां आपको मोड के लिए सिंगल का उपयोग करने की आवश्यकता है, तो आपको सर्विसहोस्ट कन्स्ट्रक्टर का उपयोग करना चाहिए जो सिंगलटन इंस्टेंस पैरामीटर स्वीकार करता है और एक हल किए गए इंस्टेंस में पास करता है। – Shaun

0

किसी ऐसे व्यक्ति को जो ऐसा करने की कोशिश कर रहा है, मैं वर्तमान में स्प्रिंग.NET का उपयोग आईओसी कंटेनर के रूप में करने की सलाह देता हूं। हालांकि कुछ अन्य कंटेनर के रूप में उपयोग करना उतना आसान नहीं हो सकता है (मुझे विशेष रूप से इसके एक्सएमएल कॉन्फ़िगरेशन का शौक नहीं है), यह अब तक का सबसे अच्छा डब्ल्यूसीएफ एकीकरण है। यह InstanceContextMode.SingleCall समस्या (इसके एओपी/गतिशील प्रॉक्सी फ्रेमवर्क का उपयोग करके) के लिए एक चालाक और पारदर्शी वर्कअराउंड के साथ आता है।

http://www.springframework.net/docs/1.2.0-M1/reference/html/wcf.html

http://www.springframework.net/doc-latest/reference/html/wcf-quickstart.html

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