2016-03-16 1 views
0

J'ai les wrappers WCF suivantes pour appeler un service REST:Comment j'utilise OperationContract pour capturer un en-tête de réponse à partir d'une requête POST?

[DataContract] 
public class InterestingResponse : IExtensibleDataObject 
{ 
    [MessageHeader(Name="x-interesting-id")] 
    public string InterestingId { get; set; } 

    public ExtensionDataObject ExtensionData { get; set; } 
} 

[ServiceContract()] 
public interface IManagement 
{ 
    [OperationContract] 
    [WebInvoke(Method = "POST", UriTemplate = @"somePathHere")] 
    InterestingResponse DoInteresting(); 
} 

La demande est envoyée au service et se termine avec succès. La réponse HTTP a le corps vide et l'en-tête x-interesting-id. Je souhaite que le code côté client renvoie une instance de InterestingResponse avec InterestingId étant définie sur la valeur x-interesting-id à partir de la réponse.

Une fois que IManagement.DoInteresting() retourne sur le client la référence nulle est retournée parce que bien, la réponse était vide, rien à désérialiser, je suppose.

Comment aurais-je un objet retourné à la place avec la valeur d'en-tête désérialisée en tant que membre d'objet?

Répondre

0

Utilisez System.ServiceModel.Channels.Message comme here. Modifier la déclaration de méthode:

[OperationContract] 
[WebInvoke(Method = "POST", UriTemplate = @"somePathHere")] 
Message DoInteresting(); 

puis une fois invokation est terminée, l'objet Message contiendra la réponse HTTP avec les en-têtes HTTP:

var invokationResult = service.DoInteresting(); 
var properties = message.Properties; 
var httpResponse = 
    (HttpResponseMessageProperty)properties[HttpResponseMessageProperty.Name]; 
var responseHeaders = httpResponse.Headers; 
var interestingHeader = reponseHeaders["x-interesting-id"];