2009-09-25 17 views
8

aracılığıyla uç noktalar arasında nasıl paylaşabilirim Hizmet arayüzümü, ilgili işlevsellikler kümelerine bölen bir Hizmet Sözleşmeleri kümesine sahibim. Şu anda tek bir hizmet sınıfı kullanarak tüm sözleşmeleri uyguluyorum (bunları daha sonra bölmek isteyebilirim ancak şimdilik tek hizmet sınıfı yeterlidir).WCF IIS hizmeti tek bir hizmet tarafından uygulanan birden çok Hizmet Sözleşmesini barındırır - uri'yi

Bitiş noktalarını bir yapılandırma dosyası kullanarak (kodun aksine) yapılandırmaya çalışıyorum. Sorun iki uç noktanın (her bir hizmet sözleşmesi için bir tane) aynı uri'yi dinlemeye çalıştığı için bir ServiceActivationException aldım. Özel ayrıntılar, bu sonuca ulaşmak için, iki uç noktanın bağlayıcı nesneyi paylaşması gerektiğini söyler, bu mantıklıdır, ancak bunu yapılandırma yoluyla nasıl yapılacağını anlayamıyorum (IIS üzerinden barındıracağım gibi bu kodu kullanarak denemedim ama Kodda yapılandırmak için basit bir egzersiz olduğunu hayal edebiliyorum).

<system.serviceModel> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
<services> 
    <service name="CDC.WebPortal.MidTier.MidTierAccessService" 
      behaviorConfiguration="MidTierServiceBehaviour" > 
    <endpoint address="" 
       binding="webHttpBinding" 
       bindingConfiguration="RestBindingConfiguration" 
       contract="****************************.IProductService" /> 

    <endpoint address="" 
       binding="webHttpBinding" 
       bindingConfiguration="RestBindingConfiguration" 
       contract="****************************.ICategoryService" /> 

    <endpoint address="mex" binding="mexHttpBinding" 
       contract="IMetadataExchange" /> 

    </service> 
</services> 

<bindings> 
    <webHttpBinding> 
    <binding name="RestBindingConfiguration" 
      maxReceivedMessageSize="104857600"> 
     <readerQuotas maxStringContentLength="104857600"/> 
    </binding> 
    </webHttpBinding> 
</bindings> 

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MidTierServiceBehaviour"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

: Aşağıdaki

Şu anda (bu hala güvenlik kaygıları vb Bu ayarların bazılarını maruz bırakabilir bu konuda halen endişeli değilim bu yüzden dev edilir) kullanıyorum yapılandırma olduğunu Yani benim sorum şu iki bitiş noktası arasındaki bu bağı nasıl paylaşırım?

this SO question Yorumlar bunu yapamayabilir, ancak doğru olduğuna inanmıyorum. eğer yardımcı olur tamam olmalıdır yapıyorum this MS publication göre

GÜNCELLEME 1 ...

Update2 İşte svc dosya içeriği:

<%@ ServiceHost Language="VB" Debug="true" 
       Service="*********************.MidTierAccessService" 
       Factory="Microsoft.ServiceModel.Web.WebServiceHost2Factory" %> 

GÜNCELLEME 3 İşte istisna ayrıntısı:

ce zaten URI '********************' dinlemek için ilişkilendirilmiştir. iki bitiş noktasının aynı ListenUri'yi paylaşmak istemeleri durumunda, aynı bağlama nesne örneğini de paylaşmaları gerekir. İki çakışan uç nokta, ya bir yapılandırma dosyasında AddServiceEndpoint() çağrılarında veya AddServiceEndpoint() ve yapılandırmasının bir bileşimi olarak belirtildi. Ben "Belirli bir .svc hizmet için birden fazla son nokta açığa zaman göreceli adresleri kullanmak gerekecektir" belirterek, daha önce this cevapsız

GÜNCELLEME 4 Ok. Bunun nedeni, hizmetin temel adresini belirleyen IIS sanal dizini ile ilgili bir şeydir, herkes bunu biraz daha ayrıntılı olarak açıklayabilir, yani IIS'nin her sözleşme için neden göreli adresleme yapması gerektiğini açıklayabilir.

cevap

7

Bilginize ve geçen ay WCF ile kapsamlı çalışmalar yapıyorum, aynı URI'yi birden fazla uç nokta için paylaşamazsınız. WCF'de, bir “hizmet”, bir sözleşmenin uygulanmasıyla değil, sözleşmenin kendisi tarafından tanımlanır (WSDL ve standart SOA uygulamalarını da izler). Uç noktalar, tek bir hizmeti birden çok iletişim kuralı (ve bunun için farklı adresler) aracılığıyla ortaya çıkarmanızı sağlar. Ancak farklı hizmetleri aynı adreste paylaşamazsınız. Mantıken işe yaramaz.

(eğer gerçekleştirmek için çalışıyoruz ne olduğunu) Aşağıdaki senaryoyu varsayalım:

IProductService exposed @ http://localhost/service 
ICategoryService exposed @ http://localhost/service 
IMetadataExchange exposed @ http://localhost/service/mex 

O MEX bitiş noktası erişmek için yeterince kolaydır ... benzersiz bir URI var. Ancak, IProductService veya ICategoryService öğelerinden birine nasıl erişirsiniz? Bir URI'yi diğerinden ayırmanıza izin veren hiçbir şey yoktur. WCF'nin, IProductservice'ye gitmesi gereken mesajlar ile ICategoryService'ye gitmesi gereken mesajlar arasında yol almasına izin verecek hiçbir şeye sahip değildir. Her ikisi de aynı URI'yi kullandığından, gerçekten bir çakışma var. Her hizmet SÖZLEŞME, benzersiz bir URI aracılığıyla açık olmalıdır. Aynı kesin bağlantıyı kullanan her son nokta ayrı bir adres kullanmalıdır.

İhtiyacınız olanı elde etmenin bir yolu var. Sorun mesaj yönlendirme. WCF, yerel olarak mesaj yönlendirmeyi OOB'yi desteklemez, ancak kendi mesaj yönlendiricinizi uygulama becerisi sağlar. (Veya, beta teknolojisini kullanmaya istekli iseniz, .NET 4.0, aşağıda bağlantılı makaleleri temel alan bir ileti yönlendirici ile birlikte gelir, ancak daha iyi yapılandırılabilirlik ile birlikte gelir.) WCF'nin gerçek bir büyücüsü olan Michele Bustamante, aşağıdaki bağlantılara yönlendirme komple uygulama ve makale açıklayan mesajı:

http://msdn.microsoft.com/en-us/magazine/cc500646.aspx http://msdn.microsoft.com/en-us/magazine/cc546553.aspx

genel bir fikir tek bir URI üzerinde dinleyen bir tek hizmet kurmak olmasıdır. Bu hizmet, tek bir hizmet işlemine joker gönderimini kullanır ve ardından her iletiyi yönlendirmek için hangi benzersiz URI'yi belirler. Tespitini istediğiniz gibi yapabilirsiniz, ancak en basit olanı, her iki eyleminizdeki IProductService ve ICategoryService üzerindeki her bir eylemin global olarak benzersiz olduğunu varsayarak, Action aracılığıyla gerçekleştirilir. Daha fazla hizmetle sonuçlanacaksınız, ancak ... yönlendiricinin kendisi, tıpkı diğer gibi barındırılması gereken ayrı bir WCF hizmetidir.

+2

+1 'doğrulanabilir büyücü' için – dan

+0

@dan: lol: D Teşekkürler. – jrista

İlgili konular