Calling WCF service dynamically with ref and out parameters - wcf

I have gone through following references and found that a WCF service can be called dynamically. But, i have not been able to call a service (method) accepting parameters as ref and out.
Calling a WCF service from a client without having the contract interface
Dynamic Programming with WCF
Dynamically Invoking Web Services... With WCF This Time
Invoking WCF Service without adding a Service Reference.
Is there any way to make such call with ref and out parameters?

Invoking WCF Service without adding a Service Reference. works greate provided i know the Contract. So i added the web reference first, copied the generated proxy into actual project and then removed the web refernce and simply called the method as
BasicHttpBinding binding = new BasicHttpBinding();
EndpointAddress epAddr = new EndpointAddress("http://192.168.0.233/GMS/GMSService.svc");
GMSContract.IGMSService _interface = ChannelFactory<GMSContract.IGMSService>.CreateChannel(binding, epAddr);
...
bool r = _interface.MyGMSMethod(..., ref ..., out ..., out ...);

Related

Proxy generated for WCF creating Message Contracts

I'm consuming a WCF service in my project for which I've added the reference using 'Add Service Reference...'. I expected it to generate a clean proxy with a ServiceClient entity and the Interface. Instead, I see that it has created a MethodNameRequest, MethodNameRequestBody, MethodNameResponse, MethodNameResponseBody entities for each OperationContract method.
So while invoking the service methods, the proxy passes to the service method an instance of MethodNameRequest with the input parameters of the method as the properties of the RequestBody. See below an example of a call to AboutInformationGet() method which doesn't accept any parameters.
public WCFDynamicInvocation.PostingService.AboutModel AboutInformationGet() {
WCFDynamicInvocation.PostingService.AboutInformationGetRequest inValue = new WCFDynamicInvocation.PostingService.AboutInformationGetRequest();
inValue.Body = new WCFDynamicInvocation.PostingService.AboutInformationGetRequestBody();
WCFDynamicInvocation.PostingService.AboutInformationGetResponse retVal = ((WCFDynamicInvocation.PostingService.IMIGQPosting)(this)).AboutInformationGet(inValue);
return retVal.Body.AboutInformationGetResult;
}
I believe this behavior is what one would expect to see in a Webservice Proxy. Hence I suspect that the WCF service is not properly configured.
Did someone here face this issue? What would be the change to be done at the service so that the proxy generated is similar to the WCF service.
Cheers.
There is a similar post here.
Right click your service reference -> Configure service reference... -> Check if "Always generate message contracts" check box is checked. Uncheck it and hit OK to regenerate the proxy to see if you get a normal proxy.
After struggling with this for some time, I've finally found that the cause for the message contracts in the proxy was the service interface had the following attribute:
[XmlSerializerFormat(Use = OperationFormatUse.Literal, Style = OperationFormatStyle.Document)]
As I understand, I could decorate the DataContracts with the following attribute to avoid wrapping
[MessageContract(IsWrapped = false)]
but the response still gets wrapped as the OperationContract hasn't been modified.
As there were no particular need to use XMLSerializer in place of WCF's default DataContractSerializer, we would remove the XmlSeralizerFormat decoration.

WCF: How to find out if service is called?

I have a requirement where I should write WCF service that is called by another external service, which code is not under my control. I only know that my service is called by that external service in this way:
string content = client.getData("http://localhost:1111/Service.svc", param);
My service is located at the address that is actually first parameter in external service method, which means my service was called somewhere inside the body of external service method.
So, my question is - how can I be signaled inside my service that my service was called by that external service?
1) you can create two endpoint for different clients (real client and external servise)
2) you can write specific behavior and realize functionality by additional paramert which will be only into behaviors

WCF service method

I am creating a wcf service in .net. In the service I have added function named XYZ as:
public int XYZ(int a){
return a+a;
}
When i added the web reference of web service in my web application and accessed the function XYZ, here it requires two parameters one is of int type and second is of bool type.
But originally i had added single parameter in XYZ function in wcf service.
If someone has idea then please let me know that how to handle this. Because my wcf service will be called from flash code.
If you are adding a Web Reference to your project instead of Service Reference then you'll get "extra" parameters as described here. You should be adding a Service Reference to create a proxy for your service that matches the WCF ServiceContract description of your service. Also, the "extra" parameters only show up for ASMX-based clients. They won't be required for the Flash client to call the WCF Service.

wcf generated classes and validation application block attributes

I'm new to the validation application block and trying to use it with wcf...
I have a wcf service that has data objects with validation rules defined with attributes, using the validation application block .
On my client side (WPF), I have a service reference. When I update the service reference the generated classes do not have the validation rules attributes in them.
How can I get the rules from the service?
Am I missing some step, or is it not possible?
When you use Add Service Reference, proxy classes are created for the service. However, this will not retain all of your Validation Attributes but just create properties corresponding to the service metadata. In order to retain the validation rules you will need to share your service and data contracts between WCF and WPF.
To do this move all of your service and data contracts into an assembly. WCF and WPF should both reference this assembly. Then you can create your own proxy class using ClientBase or ChannelFactory.
Since both WCF and WPF are referencing the same classes annotated with the VAB Attributes you can invoke validation in both WCF and WPF using Enterprise Library.

Using WCF 'Message' to call external service

I have a class, in which I have a service reference (WCF) to an ASMX web service.
This obviously generates local proxy methods such as
string DoSomething(string someParameter, string someOtherParameter)
I have a method that receives a WCF message class already representing a call to this service, which I simply need to forward
I could of course use XmlDictionaryReader to extract the information from the WCF message, deserialise into the proxy classes and pass those into the proxy method, but as these will simply get serialised back it seems very wasteful
How can I call the service using the already serialised message? (I assume I will need to modify the soap action on the incoming message)
There's a two-part series on how to build a WCF router on MSDN - maybe that helps? Seems like that's more or less what you're trying to do - use a WCF service to basically route a message on to a second service (ASMX in your case).
Marc