2010-01-20 7 views
15

IIS 7.5'te barındırılan bir WCF hizmetim var. İki sunucu var, biri test için, diğeri üretim için.WCF barındırma: svc dosyasına erişebilir ancak wsdl bağlantısına erişemez

Hizmet, sunucuda düzgün çalışıyor, ancak üretim sunucusunda aşağıdaki hata var.


Bir hizmet oluşturduk:

ben adres http erişmek

//..../ service.svc ben diyor varsayılan sayfayı görebilirsiniz.

Bu servisi test etmek için, bir istemci oluşturmanız ve servisi aramak için kullanmanız gerekir. Sen şu sözdizimi ile komut satırından svcutil.exe aracını kullanarak bunu yapabilirsiniz:

svcutil.exe http://..../service.svc?wsdl

Bu bir yapılandırma dosyası ve istemci sınıfını içeren bir kod dosyası oluşturur. İki dosyayı istemci uygulamanıza ekleyin ve Hizmeti aramak için oluşturulan istemci sınıfını kullanın.


Ancak wsdl bağlantısını tıklattığımda, wsdl sayfasına gidemiyorum. Herhangi bir hata olmadan beni bu varsayılan web sayfasına döndürür. Bir ağ/güvenlik duvarı yetkilendirme hatası olduğundan şüpheleniyorum, ancak bunun gibi bir deneyimi olan var mı?

Tüm IIS ayarları, test ve üretim sunucuları için aynıdır.

Teşekkürler, Saygılarımızla.

+0

Bir mex bitiş noktanız yapılandırılmış mı? –

+0

Evet, mex uç noktam var. –

+0

Yeniden yönlendirme sorunlarını tanıtmak için hizmetinizin önünde bir çeşit yönlendirici/yük dengeleyici var mı? –

cevap

12

Temelde bir WCF hizmeti için WSDL gezen etkinleştirmek için üç şey gerekir:

  1. http göz atmaya izin bu hizmet meta davranışı üzerinde httpGetEnabled = Doğru set hizmet meta
  2. sağlayan bir servis davranış hizmetinizde bu meta
  3. bir mex bitiş noktası için

Yani sunucu tarafında kudretini üzerinde yapılandırma böyle bir şey (artı biraz daha Stu görünüyor ff):

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="MetadataBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

    <services> 
     <service behaviorConfiguration="MetadataBehavior" name="YourService"> 
     <endpoint address="" 
        binding="basicHttpBinding" 
        contract="IYourService" /> 
     <endpoint address="mex" 
        binding="mexHttpBinding" 
        contract="IMetadataExchange" /> 
     </service> 
    </services> 
    </system.serviceModel> 

1. ve 2. şıklar burada bu hat tarafından işlenir:

<serviceMetadata httpGetEnabled="true" /> 

Bunu etkin hale gelmesi için <service> etiketinde bu hizmet davranışını başvurmak gerekir.

Nokta 3 (MEX bitiş noktası) Buraya bu bölümdür: http

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

, mexHttpBinding kullanın ve IMetadataExchange sözleşme meta alışverişi için bir WCF sistem sözleşmesidir.

+0

Katılıyorum. Tüm bu yapılandırmalar doğru şekilde ayarlanmış. Önemli bir ayrıntıdan bahsetmeyi unuttum: hizmet, test sunucumda sorunsuz çalışıyor, ancak hizmeti üretim sunucuma dağıttığımda bu hata ortaya çıktı. Rahatsızlıktan dolayı özür dileriz. –

10

aynı soruna sahipti.

<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 

belki başkası yardımcı olur: ben böyle> serviceBehaviors davranışı httpsGetEnabled ekleyerek düzelttim. 4years =) 'dan sonra bu ipucuna ihtiyacınız olduğunu düşünmeyin.

+1

Bunu yeterince kabul edemem. Benim sorunum, WSDL'leri çalıştıran bir çok servisim vardı ama bir tanesi olmadan. Çalışmamış olan sadece "httpGetEnabled" yerine "http ** s ** GetEnabled" ("s" ile) olmak zorundaydı. – Turnerj

-1

Evet, sorun meta verileri yayınlamaktır. Sadece bir tane daha ipucu ekliyorum. Ayrıca bu gibi kod kullanarak hizmet meta veri ekleyebilir: Burada

ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
smb.HttpGetEnabled = true; 

host.Description.Behaviors.Add(smb); 

Diğer ayrıntılar: http://msdn.microsoft.com/en-us/library/aa738489%28v=vs.110%29.aspx

1

Bu kadar geç olduğunu cevabını biliyorum ama aynı problem vardı ve çözüm olarak:

Etiket [ServiceContract] ve [OperationContract] hizmet arabiriminde .svc hizmete uygulanır. Visual Studio, WCF Service'u seçtiğinizde arayüz oluşturuyor ancak ben arayüzü sildim ve kendi arayüzümü oluşturdum.

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    void DoWork(); 
} 

Birilerine yardım etmeyi umuyorum.