2014-06-11 24 views
12

WCF hizmetimde .NET 4.5.1 ve istemci windows hizmeti uygulaması için .NET 4.0 kullanıyorum.WCF Hizmet Başvurusu? FCL türünü kullanmıyor

Veri Sözleşmesinde, DateTimeOffset? türünde bir DataMember var (null DataTimeOffset).

WCF servisine Servis Referansı Eklediğimde, DateTimeOffset?'un karmaşık bir tür olduğunu düşünür. Başka bir deyişle, bir System.DateTimeOffset? olduğunu düşünmüyor, bunun bir ServiceReference1.DataTimeOffset?

olduğunu nasıl düzeltir? Bunu nasıl düzeltirim?

İşte ben bugüne kadar çalıştığım buydu:

  1. bu gösterir en basit örnek çözümü oluşturun. Maalesef sorunu yeniden oluşturamadım, bu yüzden yapılandırmamla ilgili benzersiz bir şey olmalı.

  2. [KnownType(typeof(DateTimeOffset?))] ile DataContract sınıfına açıklama ekleyin. Ne yazık ki bu bir şey yapmadı. "Başvurulan derlemelerdeki türleri yeniden kullan" seçeneğini işaretleyin. Bu, "ServiceReference1" nesnesinin Konsol Uygulamasında hiç bulunmayan etkisine sahipti.

Bunun nasıl düzeltileceği konusunda başka herhangi bir fikrin var mı?

Teşekkür ederiz.

+0

ne istemci çözüm gibi görünüyor: bütün başvurulan derlemeler yılında türünü yeniden? Servis derlemelerini test istemcinize dahil ediyor musunuz? – dblood

+0

@dblood, cevap için teşekkürler. Evet, bu garip bir şey. WCF projesi ve Konsol Uygulaması projesi tarafından başvurulan kendi projesinde (sınıf kitaplığı) Veri Sözleşmem var. – BlueSky

+0

Tamam, bu iyi. Biz daha önce kesin çözüm türünü kullandık. İstemci için çözüm kaşifinin ekran görüntüsünü gönderebilir mi? – dblood

cevap

0

Aradığınız davranışı almak için kesinlikle "Başvurulan derlemelerdeki türleri yeniden kullan" seçeneğini belirtmeniz gerekecek.

Sorunuz o zaman, Konsol uygulamanızda hizmetinizin sunulmamasına neden olan sorun haline gelir. Çözümünüzün doğru şekilde kurulmadığını tahmin ediyorum ama daha fazla ayrıntıya ihtiyacım var. Konsol uygulamasını içeren çözümün bir ekran görüntüsü ideal olacaktır.

Servis başvurunuzu Konsol Uygulaması projesine veya başka bir projeye eklediniz mi?

1

KnownType ile doğru yoldasınız.

Hedefinize ulaşmak için "Hizmet Referansı Ekle" özelliğini kullanamazsınız. Bunun yerine, istemci uygulamanızın [ServiceContract] sınıfınıza bir referansı olmalıdır. Daha sonra, bir ChannelFactory kullanarak servisi doğrudan çağırabilirsiniz.

Sunucu Kodu:

using System; 
using System.Runtime.Serialization; 
using System.ServiceModel; 

namespace Server 
{ 
    public class Service : IService 
    { 
     public ReturnContract GetOffset() 
     { 
      return new ReturnContract { Offset = new DateTimeOffset(DateTime.Now) }; 
     } 
    } 

    [ServiceContract] 
    public interface IService 
    { 
     [OperationContract] 
     ReturnContract GetOffset(); 
    } 

    [DataContract] 
    [KnownType(typeof(DateTimeOffset))] 
    public class ReturnContract 
    { 
     [DataMember] 
     public DateTimeOffset? Offset { get; set; } 
    } 
} 

Müşteri Kodu ya da veri sözleşmeleri projeleri düzgün inşaatı değil veya DateTimeOffset ve Nullable<> ihtiva kütüphane yeniden seçemezsiniz zaman can olur

using Server; 
using System; 
using System.ServiceModel; 

namespace Client 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var cf = new ChannelFactory<Server.IService>("endpoint"); 
      var service = cf.CreateChannel(); 
      ReturnContract c = service.GetOffset(); 

      Console.WriteLine(c.Offset); 
      Console.ReadLine(); 
     } 
    } 
} 
1

- mscorlib ve/veya veri sözleşmesi projeniz.

  1. Veri sözleşmeleri proje hedef çerçeve .NET Framework 4.0 daha büyük değildir:

    Yani emin olun. .NET Framework not forward compatable olduğundan. istemci projeden kendisine referans uyarı işareti ile işaretlenmiş edilmemelidir:
    Broken reference in client library

  2. Veri sözleşmeleri proje
  3. Hem mscorlib ve veri sözleşmeleri proje
  4. türleri yeniden gerekir veya seçtiğiniz referans listesinde olan builded Service reference configuration dialog window