Hi Stephen, it looks like an later message of mine may have got lost. I
accidentally found that my worry about WCF behaviours was wasted, as many
WCF interfaces are not supported on the Silverlight client. I stumbled over
an article that pointed I have to do the following (simplified real code).
The code is a bit obtuse because I had to use Action callback combined with
using to keep the OperationContext open while methods are called. I hope
this skeleton code might be of use to others who have to pass arbitrary
extra data from a WCF client to the service. The key bits are:

 

.         The method CallWrapper on the client puts a header into the client
proxy. I have to use this wrapper on each call and it has to be wrapped in a
using.

.         The method GetHeaderValue<> on the server pulls header values out
of the current context. It's interesting that it's generic and you can get
strongly typed values.

 

Cheers,

Greg

 

 

Sliverlight Client

 

public void SampleSeviceCall(int xmlToken, Action<bool, Exception,
SampleResultWrapper> callback)

{

    using (var client = MakeClient())

    {

        client.Proxy.SampleSeviceCallCompleted += (s, e) =>

        {

            callback(e.Cancelled, e.Error, e.Result);

        };

        CallWrapper(client, () => {
client.Proxy.SampleSeviceCallAsync(xmlToken); });

    }

}

 

private void CallWrapper(SafeClient<AggregationClient, IAggregationService>
client, Action callback)

{

    using (OperationContextScope ocs = new
OperationContextScope(client.Proxy.InnerChannel))

    {

        OperationContext.Current.OutgoingMessageHeaders.Add(

                   MessageHeader.CreateHeader("secretId", "MyNamespace",
secretId));

        callback();

    }

}

 

WCF Service

 

public SampleResultWrapper SampleServiceMethod(int xmlToken)

{

    Guid secretId = GetHeaderValue<Guid>("secretId");

    SampleResultWrapper result = new SampleResultWrapper();

    try

    {

        result.SomeXml = GetTheXml(xmlToken);

    }

    catch (Exception ex)

    {

        result.Error = ex;

    }

    return result;

}

 

private T GetHeaderValue<T>(string name)

{

    int index =
OperationContext.Current.IncomingMessageHeaders.FindHeader(name, "
MyNamespace ");

    return (index >= 0 ?

        OperationContext.Current.IncomingMessageHeaders.GetHeader<T>(index)
:

        default(T));

}

 

 

 

Reply via email to