2014-06-11 10 views
12

Używam .NET 4.5.1 dla mojej usługi WCF i .NET 4.0 dla aplikacji usługi Windows klienckiej.Usługa WCF Reference for DateTimeOffset? nie używa FCL typu

W umowie danych znajduje się DataMember typu DateTimeOffset? (wartość zerowa DataTimeOffset).

Po dodaniu odwołania do usługi do usługi WCF uważa się, że DateTimeOffset? jest złożonym typem. Innymi słowy, nie sądzisz, że jest to System.DateTimeOffset?, uważa się, że jest to ServiceReference1.DataTimeOffset? Jak to naprawić?

Oto, co starałem dotąd:

  1. stworzyć najbardziej prosty przykład pokazuje, że to rozwiązanie. Niestety nie mogłem odtworzyć problemu, więc musi to być coś unikalnego w mojej konfiguracji.

  2. Napisz adnotację do klasy DataContract z [KnownType(typeof(DateTimeOffset?))]. Niestety to nic nie dało.

  3. Sprawdź "Typy ponownego wykorzystania w zespołach referencyjnych". To spowodowało, że obiekt "ServiceReference1" nie był w ogóle dostępny w aplikacji Console.

Ktoś ma jakieś inne pomysły, jak to naprawić?

Dziękuję.

+0

Co rozwiązanie klient wygląda? Czy uwzględniasz zestawy usług w swoim kliencie testowym? – dblood

+0

@dblood, dzięki za odpowiedź. Tak, to dziwne. Mam umowę danych w jej własnym projekcie (bibliotece klas), do której odwołuje się zarówno projekt WCF, jak i projekt aplikacji konsolowej. – BlueSky

+0

OK, to dobrze. Już wcześniej używaliśmy tego rodzaju rozwiązania. Czy może opublikować zrzut ekranu eksploratora rozwiązań dla klienta? – dblood

Odpowiedz

0

Zdecydowanie będziesz musiał określić "Typy ponownego użycia w zestawach referencyjnych", aby uzyskać pożądane zachowanie.

Pojawia się pytanie, dlaczego usługa nie jest dostępna w aplikacji Konsola. Zgaduję, że twoje rozwiązanie nie jest poprawnie skonfigurowane, ale potrzebowałbym więcej szczegółów. Zrzut ekranu rozwiązania zawierającego aplikację konsolową byłby idealny.

Czy dodano odwołanie do usługi do projektu aplikacji konsoli lub innego projektu?

1

Jesteś na właściwej drodze dzięki KnownType.

Aby osiągnąć swój cel, nie można użyć opcji "Dodaj odniesienie do usługi". Zamiast tego twoja aplikacja kliencka musi mieć odniesienie do twojej klasy [ServiceContract]. Następnie można bezpośrednio wywołać usługę przy użyciu ChannelFactory.

Kod serwera:

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; } 
    } 
} 

kod klienta

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

które mogą się dzieje, gdy albo wasze projekty umów dane nie są prawidłowo odbudowane lub nie wybrać do ponownego użycia biblioteki, które zawierają DateTimeOffset i Nullable<> - mscorlib i/lub twój projekt umowy danych.

Więc upewnij się, że:

  1. Dane projekt umowy ramowej celem jest nie większa niż .NET Framework 4.0. Ponieważ .NET Framework to not forward compatable. Odniesienie do niego z projektem klienta nie musi być oznaczony znakiem: Projekt
    Broken reference in client library
  2. kontrakty dane są pobudowane
  3. Zarówno mscorlib i projekt umowy dane znajdują się na liście referencyjnej, która potrzebuje typy do ponownego wykorzystania lub wybrać do ponownego użycia typu w wszystkie odwołuje zespoły: Service reference configuration dialog window