event based model client and ChannelFactory<T> - c#

Hallo again my question regards to event based model client development in WCF service client infrastructure. what I would lice to know is that, instead of using ClientBase is it possible to manually implement this patten with ChannelFactory so for example I could write GetDataAsync for client access and still using ChannelFactory and implementing serverside async calls here?

The answer will depend on whether you control the service contract or not. If you can define the service contract then you add the appropriate begin/end methods that return/use the IAsyncResult as shown in the code in this blog post.
If you can't change the service contract then you must create an async version of the service contract manually and feed that to the ChannelFactory. The ChannelFactory itself does not provide an async mode of service operation invocation. Your code will end up looking something like the code in this MSDN sample.

Related

c# WCF DataService client behavoir similar to BeforeSendRequest

I have a WinForm client that its using WCF DataServices. I would like to know if WCF DataServices has some kind of BeforeSendRequest and AfterSendRequest so I can show on the UI an icon that some database request its running.
Any clue?
Thanks
Unfortunately WCF doesn't have anything like Global.asax where we can handle BeginRequest and EndRequest
Based on your question, I guess the interface IClientMessageInspector will be handy.
The methods to be implemented will be BeforeSendRequest and AfterReceiveReply. I guess these are the two events you are looking for.
The documentation regarding this is available in the following msdn link
http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iclientmessageinspector.aspx
In short, you will have to implement the IClientMessageInspector( part of System.ServiceModel.Dispatcher) and also implement IEndpointBehavior (part of System.ServiceModel.Description) to hook the inspector on to the client endpoint. And thus change the configuration in the client endpoint to refer the endpoint behaviour that was added.

WCF Workflow Service REST interface [duplicate]

This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
RESTful Workflow Service Endpoints in WF4 / WCF
I am trying to make Windows Workflow Services 4.0 work with a REST interface. I have a very simple workflow service called "Service1" with a receiveRequest and sendResponse activity.
By default WF Services autogenerate the classes and interfaces implemented, however i would like to force the WF Service to use my own REST enabled interface instead of some internal autogenerated interface.
The interface would be the following:
[ServiceContract]
public interface IService
{
[OperationContract]
[WebInvoke( UriTemplate = "/Data/{item}", Method = "GET" )]
String GetData( Int32 item );
}
However, i have difficulties configuring the XAML to work with this interface.
I would need a XAML configuration like this to specify that the Service contract name is my own contract:
<Receive x:Name="__ReferenceID0" CanCreateInstance="True" DisplayName="ReceiveRequest" sap:VirtualizedContainerService.HintSize="464,90" OperationName="GetData" ServiceContractName="w:IService">
However when i run this workflow service i get the following exception:
The contract name 'wfService.IService' could not be found in the list of contracts implemented by the service 'Service1'.
However, the service that gets created behind the scenes does not implement the IService interface and i would like to know how can i extend the service that gets instantiated by the workflow engine to implement my own interface (which i described above)?
Thanks
In WF4 you cannot declare ServiceContract in code and use it. Contract is declared in XAML and WorkflowServiceHost generates endpoint from declaration.
To enable REST for for your workflowservice you have few options:
Use HttpWorkflowHost from http://wf.codeplex.com/wikipage?title=WebAPIWorkflow. Limitation is that then you will have only REST.
Do something similar to this: http://msdn.microsoft.com/en-us/library/aa967564.aspx
Differences are: replace WorkflowFormatterBehavior instead of DataContractSerializerOperationBehavior, arguments are extracted from message contract instead of operation contract and keep in mind that you will not have client part of this example and you will have to format response according to protocol.

CallBack in WCF?

How we use CallBack in WCF fluently with events and delegates?
If Client give any request or any conditions matches of client then services automatically fire the event which condition or request given from client.
how is it possible?
A cleaner model is an event driven one using a Publish/Subscribe Pattern.
Read this to get inside onto both methods.
http://msdn.microsoft.com/en-us/magazine/cc163537.aspx
You basically define a service method as one-way and also create a message callback. See more here: http://idunno.org/archive/2008/05/29/wcf-callbacks-a-beginners-guide.aspx

When should I use OperationContextScope inside of a WCF service?

I'm currently working on a WCF service that reaches out to another service to submit information in a few of its operations. The proxy for the second service is generated through the strongly typed ProxyFactory<T> class. I haven't experienced any issues but have heard I should do something like the following when making the call:
using (new OperationContextScope((IContextChannel)_service))
_service.Send(message);
So my question is: when is creating this new OperationContextScope appropriate, and why?
Thanks!
If you are using callbacks or if you want to modify the message or headers then you need to use OperationContextScope. Your service might need to modify outgoing headers while calling that another service.
When you establish OperationContextScope then you can:
Access and modify incoming and outgoing message headers and other properties.
Access the runtime, including dispatchers, the host, channel, and extensions.
Access other types of contexts, such as security, instance, and request contexts.
Access the channel associated with the OperationContext object or (if the channel implements System.ServiceModel.Channels.ISession) the associated channel's session identifier.
The other service which you call, is it a session-based service? Probably you need to look at its sample client code or documentation if available.

Does adding an operation to a WCF Service contract nessecerly means that all WCF client should update their references?

I'll be more specific.
Lets say I have a contract defined for my WCF service. And I have two different WCF clients which reference to this service : "ClientA" and "ClientB".
Now , lets say I want to add an operation (method) to my service which only "ClientB" will use , Lets say I added this operation to the contract and "ClientB" updated its reference and we're all happy. Does clientA also need to update it's reference even though it is not using the new operation?
The client only needs to update his reference, if it's going to use the new Operation contract.
Check out this article: Versioning WCF Contracts
No, WCF web references are generated by the IDE very similarly to references to ASMX or other web services, which means that it breaks things down into a method inventory, such that the client calling code operates as though it were invoking a remote API. Therefore, if only new stuff that does not alter the expected existing functionality is added, then old clients do not need to update.

Categories

Resources