WCF tesisi için eksik olan dokümanlar konusunda hemfikirler ve bu çok üzücü çünkü gerçekten harika bir araç ve eğer insanlar '
- A sınıfı: t en sahip üç proje uygulaması oluşturalım ... başlayabilecekleri olamazdı çünkü kullanmak, bu yüzden eğer ben biraz size yardımcı olabilir bakayım Paylaşılan sözleşmeler için kütüphane
- Sunucu olarak işlem gören bir konsol uygulaması
- bir müşteri
fikri gibi davranan bir konsol uygulaması biz hizmetlerini kayıt sırasında hizmet adları kullanmaya ve temel URL paylaşmak isterler ki (ben ne soran vardı düşünüyorum ve eğer değilse, umarım sizden daha iyi tahmin edebilirsiniz.
[ServiceContract]
public interface IMyService1
{
[OperationContract]
void DoSomething();
}
[ServiceContract]
public interface IMyService2
{
[OperationContract]
void DoSomethingToo();
}
Şimdi sunucu konsolu uygulaması şöyle
, biz öncelikle sadece orada hizmet sözleşmeler özel (yine hiçbir şey uygulamak: Yani, öncelikle paylaşılan sözleşmeler sadece (özel bir şey, normal bir WCF ücret) içinde bu vardır arayüzleri uygulayan dersler) ve sonra hepsini sadece servis olarak kaydediniz (burada herhangi bir yapılandırma dosyasına gerek yoktur ve Windsor'un size sunduğu tüm seçenekleri kullanarak hizmetler vb. karar verme şeklinizi değiştirebilirsiniz) - şemam biraz sınırlıdır ama size bir fikir verir):
namespace Services
{
public class MyService1 : IMyService1
{
public void DoSomething()
{
}
}
public class MyService2 : IMyService2
{
public void DoSomethingToo()
{
}
}
}
//... In some other namespace...
class Program
{
// Console application main
static void Main()
{
// Construct the container, add the facility and then register all
// the types in the same namespace as the MyService1 implementation
// as WCF services using the name as the URL (so for example
// MyService1 would be http://localhost/MyServices/MyService1) and
// with the default interface as teh service contract
var container = new WindsorContainer();
container.AddFacility<WcfFacility>(
f => f.CloseTimeout = TimeSpan.Zero);
container
.Register(
AllTypes
.FromThisAssembly()
.InSameNamespaceAs<MyService1>()
.WithServiceDefaultInterfaces()
.Configure(c =>
c.Named(c.Implementation.Name)
.AsWcfService(
new DefaultServiceModel()
.AddEndpoints(WcfEndpoint
.BoundTo(new WSHttpBinding())
.At(string.Format(
"http://localhost/MyServices/{0}",
c.Implementation.Name)
)))));
// Now just wait for a Q before shutting down
while (Console.ReadKey().Key != ConsoleKey.Q)
{
}
}
}
Sunucu, şimdi bu hizmetleri nasıl tüketirsiniz? Eh, aslında, burada oldukça kolay bir istemci konsol uygulaması (sadece sözleşmeler sınıf kitaplığına başvurur): bu kadar
class Program
{
static void Main()
{
// Create the container, add the facilty and then use all the
// interfaces in the same namespace as IMyService1 in the assembly
// that contains the aforementioned namesapce as WCF client proxies
IWindsorContainer container = new WindsorContainer();
container.AddFacility<WcfFacility>(
f => f.CloseTimeout = TimeSpan.Zero);
container
.Register(
Types
.FromAssemblyContaining<IMyService1>()
.InSameNamespaceAs<IMyService1>()
.Configure(
c => c.Named(c.Implementation.Name)
.AsWcfClient(new DefaultClientModel
{
Endpoint = WcfEndpoint
.BoundTo(new WSHttpBinding())
.At(string.Format(
"http://localhost/MyServices/{0}",
c.Name.Substring(1)))
})));
// Now we just resolve them from the container and call an operation
// to test it - of course, now they are in the container you can get
// hold of them just like any other Castle registered component
var service1 = container.Resolve<IMyService1>();
service1.DoSomething();
var service2 = container.Resolve<IMyService2>();
service2.DoSomethingToo();
}
}
- umarım bu başlamanıza olacak (bunu bulmak denemeler ve genellikle intellisense kullanarak Gitmem gereken yere varır).Size hem servis hem de müşteri tarafını gösterdim ama isterseniz birini veya diğerini kullanabilirsiniz.
Bağlamanın nerede yapılandırıldığını ve URL'leri oluşturmayla ilgili olarak nereye gittiğimi görebilmeniz gerekir. Bu durumda, temel URL'nizi kolayca bir yapılandırma dosyasından veya ne yapmak istediğinizden koparırsınız.
söz Son bir şey böyle bir şey olurdu istemci örnekte böylece, bitiş noktasına bir uzantısı olarak ekleyerek özel uç nokta davranışını ekleyebilir olmasıdır
:
Endpoint = WcfEndpoint
.BoundTo(new WSHttpBinding())
.At(string.Format("http://localhost/MyServices/{0}", c.Name.Substring(1)))
.AddExtensions(new AuthTokenBehavior())
bir gibi çalışır çekicilik, çok teşekkür ederim. –
bu ne yapar? (f => f.CloseTimeout = TimeSpan.Zero) –
Bu, tüm hizmetler için varsayılan closetimeout'u ayarlar - bu, "Kapat işleminin tamamlanması için sağlanan süreyi belirleyen bir TimeSpan değeri. Bu değer, Sıfır'a eşittir. Varsayılan değer 00:01:00. " - http://msdn.microsoft.com/en-us/library/ms731361.aspx adresinden. Ayrıca burada tüm olası zaman aşımlarından bahsedecek iyi bir konu: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/84551e45-19a2-4d0d-bcc0-516a4041943d/ – kmp