2014-03-07 2 views
6

Ich habe den folgenden Code:Wie ersetzen Sie die Namenskonvention für ServiceContract und OperationContract?

[ServiceContract(Name = "Save{0}")] 
public ISave<T> where T : BusinessObject 
{ 
    [OperationContract(Name = "Save")] 
    void Save(T obj); 
} 

public class SaveCustomer : ISave<Customer> 
{ 
    public void Save(Customer obj) { ... } 
} 

Das Problem ist, dass ich meine WCF App IIS/war nicht der Name mag ich gegeben habe. Es wird nicht automatisch ausgefüllt. Ich habe diese stackoverflow question gesehen, die Antworten auf hat, warum die Namen nicht automatisch formatieren. Anstatt darauf zu warten, dass Microsoft formatierte Namen berücksichtigt, habe ich gesehen, ob ich die Funktionalität, die den Namen bekommt, durch meine eigene ersetzen kann.

Ich bin nur unsicher, welche Klasse ich erweitern muss (ServiceHost, ServiceHostFactory, DataContractSerializer, etc.), oder sogar welche Methode muss ich überschreiben, um einen freundlicheren Namen zu bekommen. Da ich nicht einmal weiß, welche Klasse ich erstellen muss, habe ich keine Ahnung, wo ich meiner App mitteilen könnte, sie zu verwenden (Global.asax-Mitglied? Svc-Datei? Attribut?).

Antwort

1

Die Antwort scheint zu sein, dass dies nicht wirklich benötigt wird. Es scheint, dass Dienstnamen per Konvention erstellt werden. Wenn Sie Ihren Code entsprechend ändern:

[ServiceContract] // No use of the 'Name' property 
public ISave<T> where T : BusinessObject 
{ 
    [OperationContract(Name="Save")] 
    void Save(T obj); 
} 

public class SaveCustomer : ISave<Customer> 
{ 
    public void Save(Customer obj) { /* Do stuff here */ } 
} 

dann die resultierende Konfiguration sollte in der web.config-Datei wie folgt aus (vorausgesetzt, ein basicHttpBinding):

<service name="SaveCustomer"> 
    <endpoint 
     address="http://localhost:8001/SaveCustomer/" 
     binding="basicHttpBinding" 
     contract="ISave`1[[FullyQualifiedNamespaceTo.Customer, AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=....]]" 
    /> 
</service> 

fand ich diese here in den Kommentaren der akzeptierte Antwort. Offensichtlich müssen Sie Ihren eigenen Assemblynamen, Version, Kultur und PublicKeyToken angeben. Wenn Sie kein PublicKeyToken haben, glaube ich, dass Sie es abstellen können.

So scheint es, dass durch die ServiceContractAttribute auf Ihren ISave<T> Schnittstelle deklarieren, dann diese Schnittstelle in einer Klasse Umsetzung SaveCustomer führt zu einem Dienst namens SaveCustomer genannt (das ist, was ich glaube, Sie waren nach). Obwohl Sie möglicherweise mit der Syntax umgehen müssen, die für generische Typen verwendet wird, wenn sie in web.config Dateien angegeben sind.

Also, wenn Sie einen anderen Service-Klasse hatte, z.B .:

public class SaveOrder : ISave<Order> 
{ 
    public void Save(Order obj) { /* Do stuff here */ } 
} 

dann sollten Sie mit einem anderen Service-Endpunkt-Konfiguration am Ende:

<service name="SaveOrder"> 
    <endpoint 
     address="http://localhost:8001/SaveOrder/" 
     binding="basicHttpBinding" 
     contract="ISave`1[[FullyQualifiedNamespaceTo.Order, AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=....]]" 
    /> 
</service> 

HTH.

Verwandte Themen