2009-06-03 29 views
38

Arkaplan
geçmişte ASMX web hizmetleri oluşturduk ve adres kuralını kullanarak istekleri GET web tarayıcısından hizmete erişmek ve Ajax mümkün olmuştur:
MyService.asmx/MyMethod?Param=xxxyapma GET ile bir WCF Web Service çalışma istekleri

WCF kullanmaya yeni başladım ve ASP.NET projemde yeni bir web hizmeti oluşturdum. MyService.svc gibi .svc uzantılı bir dosya oluşturur.

Mevcut Durum
Ben VS2008 ile gelir WcfTestClient kullanarak hizmet tüketmek mümkün. Ayrıca başka bir projeye bir hizmet başvurusu ekleyerek veya proxy ve config dosyası oluşturmak için svcutil.exe komut satırını kullanarak kendi WCF İstemcisini oluşturabiliyorum.

Sorun
Ben MyService.svc/MyMethod?MyParam=xxx kullanarak bir tarayıcıdan hizmetini kullanmayı deneyecektir, ben herhangi bir hata olmadan boş bir sayfa olsun.

Ben
denedi Ne Zaten web.config bir basicHttpBinding eklendi ve davranış yapılandırmasında o HttpGetEnabled yaptık. Ayrıca, iş sözleşmem için [WebGet(UriTemplate = "MyMethod?MyParam={MyParam}")] özniteliğini ekledim.

Zaten bu diğer yığın taşması söz konusu bilgiyi izlemiştir: Ancak
REST/SOAP EndPoints for a WCF Service

, ben de o adımları uyguladıktan sonra boş bir sayfa veya bir HTTP 404 hata olsun. Kod hakkında özel bir şey yok. Sadece bir string olarak bir parametre alıyorum ve "Hello xxx" i döndürüyorum. Bu temel bir "Hello WCF Dünya" kavram-kanıt tipi şeydir.


GÜNCELLEME - İlgili kod

var
[ServiceContract] 
public interface IMyService 
{ 
    [WebGet(UriTemplate = "MyMethod/MyParam={MyParam}")] 
    [OperationContract] 
    string MyMethod(string MyParam); 
} 

Web.Config - System.ServiceModel Bölüm

<system.serviceModel>  
    <behaviors> 
     <serviceBehaviors>   
      <behavior name="MyServiceBehavior"> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="MyServiceBehavior" name="MyService"> 
     <endpoint address="" 
         binding="wsHttpBinding" contract="IMyService" /> 
     <endpoint address="MyService.svc" 
         binding="basicHttpBinding" contract="IMyService" /> 
     <endpoint address="mex" 
         binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services>  
</system.serviceModel> 

cevap

43

sizin web.config ServiceModel bölümünde baktığımızda, sana bir webHttpBinding ekleyip webHttpGet içeren bir endPointBehavior ilişkilendirmek gerektiğini görebiliriz.

Operasyonunuz sözleşme doğrudur. Burada bir GET HTTP isteği hizmeti tüketmek edebilmek için System.ServiceModel yapılandırma bölümü sırayla görünmelidir nasıl.

<system.serviceModel>  
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="MyServiceBehavior"> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="true"/>   
      </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="WebBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors>  
    <services>  
     <service behaviorConfiguration="MyServiceBehavior" name="MyService"> 
     <endpoint address="ws" binding="wsHttpBinding" contract="IMyService"/> 
     <endpoint address="" behaviorConfiguration="WebBehavior" 
        binding="webHttpBinding" 
        contract="IMyService"> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services>  
</system.serviceModel> 

aksi takdirde aynı URI dinleyen iki uç noktayı sahip olduğunu belirten bir hata alırsınız, sizin wsHttpBinding bitiş noktasına farklı bir adres atamak için emin olun.

Diğer bir seçenek wsHttpBinding adres boş bırakın, ancak WebHttpBinding hizmetine farklı bir adres atamak etmektir. Ancak, bu GET adresinizi de değiştirecektir. Örneğin, adresi "asmx" olarak atarsanız, hizmetinizi "MyService.svc/asmx/MyMethod?MyParam=xxxx" adresiyle çağırırsınız.

+0

Sanırım gereken tek şey endpointBehavior eklemekti. Bir çekicilik gibi çalıştı. Teşekkür ederim. – ichiban

5

Normal WCF istekleri hep SABUN isteklerdir - Eğer mümkün olmayacaktır Bunu sadece tarayıcınızla devam ettirmek için, bunun için WCF Testclient'e ihtiyacınız olacak.

WCF hizmetlerini sorgulamak için GET/POST/PUT/DELETE HTTP komutlarını kullanmanıza olanak veren WCF REST Starter Kit (WCF 4.0 ile .NET 4.0'da dahil edilecektir) adlı WCF için bir eklenti vardır. . Yine de REST için hizmetlerinizi yazmanız gerekir, ancak aynı servis çağrısında SOAP ve REST bulunamaz. Marc

4

marc_s says gibi, DİNLENME Başlangıç ​​Kiti yardımcı olabilir, ama aynı zamanda .NET 3.5 doğrudan onun içinde DİNLENME hizmetleri için desteği vardır bilmelidir. Başlangıç ​​kiti ile yapabilecekleriniz kadar eksiksiz değil, ancak kullanışlı.

[WebGet(UriTemplate = "helloworld/{name}")] 
string Helloworld(string name); 

ton bilgi için this portal bakınız:

Çalışma tarzı gelen URL içinde çeşitli parametreleri gelmelidir nereye belirtmek için operasyonları üzerinde [WebGet] niteliği koymak olmasıdır.

Not: Yapılandırmada birden fazla bitiş noktası/bağlama belirtmeniz durumunda, aynı hizmetin hem SOAP ve REST olarak maruz kalmasını sağlayabilirsiniz.

+0

benim söz konusu söz olarak benim Operasyonu sözleşmede WebGet niteliğini var. Sorumun içinde UriTemplate kısmını cevapsız, ama bu benim kodunda var nasıl. Bunu kendin denedin mi? – ichiban

+0

Evet, bu bizim REST hizmetleri oluşturmak nasıl. –

+0

UriTemplate benim için çalışıyor. – Cheeso

İlgili konular