Dynamic Programming with WCF
Update: Please check out the post on memory footprint and dynamic proxy (https://blogs.msdn.com/vipulmodi/archive/2008/10/16/dynamic-proxy-and-memory-footprint.aspx)
-----
Ever wonder what it would like to go from WSDL to code at runtime? Check out my WCF Dynamic Proxy tool that I posted on the wcf.nefx3.com community site. The WCF Dynamic Proxy downloads the WSDL, generate the code, compile the code and then allow you to invoke the web service operations using reflection, all at runtime. Here is the readme from the tool: https://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=netfxsamples&DownloadId=3939
The DynamicProxy allows you to create the dynamic WCF client at runtime by specifying the WSDL URI of the service. The DynamicProxy does not depend on the precompiled proxy or configuration. The DynamicProxy uses the MetadataResolver to download the metadata from the service and WsdlImporter to create the contract and binding at runtime. The compiled dynamic proxy can be used to invoke the operations on the service using reflection.
The example shows how you can the dynamic proxy to invoke operations that use simple types and complex types. The flow of usage is as following.
1. Create the ProxyFactory specifying the WSDL URI of the service.
DynamicProxyFactory factory = new DynamicProxyFactory("https://localhost:8080/WcfSamples/DynamicProxy?wsdl");
2. Browse the endpoints, metadata, contracts etc.
factory.Endpoints
factory.Metadata
factory.Contracts
factory.Bindings
3. Create DynamicProxy to an endpoint by specifying either the endpoint or
contract name.
DynamicProxy proxy = factory.CreateProxy("ISimpleCalculator");
OR
DynamicProxy proxy = factory.CreateProxy(endpoint);
4. Invoke operations on the DynamicProxy
dobule result = (dobule)proxy.CallMethod("Add", 1d ,2d);
5. Close the DynamicProxy
proxy.Close();
Comments
Anonymous
February 21, 2007
Hi, We had to face similar problematics, the result is two libraries. The first one uses only .NET 2.0 and offers similar programmatic experience for Asmx, Remoting and Wse 3.0. You can have a look at http://www.codeplex.com/ProxyFactory. The second uses WCF and it introduces the concept of leveraging a service metadata in order to retrieve at runtime its endpoint configuration therefore avoiding duplicating the configuration information on both service and all its clients. It is also leveraging ChannelFactory<T> for strongly typed proxy generation. Article, video and sample code are available at this url : http://netfxfactory.org/blogs/papers/archive/2007/01/24/An-effective-way-to-access-wcf-services.aspx We would be interested by your feedback.Anonymous
February 21, 2007
Is there sample for "net.tcp://www.codeplex.com/ProxyFactory."? Thanks a lot.Anonymous
March 16, 2007
A remonting sample (tcp://localhost:9000/AccountManager.rem) is provided in the getting started of the ProxyFactory project. And the SmartChannelFactory project based on WCF technology supports, of course, the NetTcpBinding.Anonymous
May 23, 2007
I tried to implement the same factory concept in my apps. , in which i want to dynamically invoke different third party webservices and is giving issues regarding the contracts. I will not be able to implement the contract info into these third aprty webservices, but i want to invoke them on fly. How can i go about resolving it... tips welcome..Anonymous
July 13, 2007
When I try to read WSDL using the dynamic proxy class in this blog, for certain web services I get the an error message similar to the following: "Cannot import wsdl:bindingrnDetail: The required WSDL extension element 'binding' from namespace 'http://schemas.xmlsoap.org/wsdl/http/' was not handled.rnXPath to Error Source: //wsdl:definitions[@targetNamespace='http://someurl.com']/wsdl:binding[@name='StockQuotesHttpGet']" I've noticed that the error always occurs on web services with HttpPost and HttpGet bindings. I can read these web services successfully with webservicestudio, so I know the WSDL is valid. Could this be a WCF/WSE limitation? Any ideas on how to resolve it?Anonymous
August 16, 2007
Will it work with any kind of binding, including netMsmqBinding (with metadata through WS HTTP binding)?Anonymous
September 27, 2007
Hi Vipul Can I use DynamicProxy with NetDataContractSerializer. I am trying to refer the NetDataContractSerializer (Aaron Skonnard's implementation) with Dynamic Proxy, and I am getting the dynamicproxy dll not found error while invoking the service. Any help is highly appreciated RamaAnonymous
January 30, 2008
How to do Exception handling with Dynamic proxyAnonymous
February 28, 2008
The comment has been removedAnonymous
March 12, 2008
The comment has been removedAnonymous
March 13, 2008
i just want to get on at schoolAnonymous
April 07, 2008
Thanks for the excellent work. I was able to incorporate this into a client console application in my environment, which works fine, but when using a WinForms client, the call to serviceFinder.Probe() always results in a timeout. I suspect this may be related to SynchronizationContext, but have been unable to overcome the issue. Any suggestions would be appreciated.Anonymous
May 19, 2008
Thanks for using the sample and thanks for the comments. Let me try to answer some them here.
- Can I use Dynamic Proxy with other bindings? Yes you can.
- I get an error while creating the factory. Run SVCUTIL on the URL you are trying to create the proxy for. If SVCUTIL gives an error the dynamic proxy will. Try to debug the issue with SVCUTIL.
- What about downloading the metadata through MEX endpoint instead of ?wsdl. Yes, you can modify the sample to download metadata using System.ServiceModel.Description.MetadataExchangeClient.
- What about complex types in my service contact, how do I use them? If you already have the service contract and types pregenerated, you can simply create a channel factory using known service contract and binding and address given to you by the dynamic proxy factory. If you do not have the service contract before hand, you are left with using Reflection. The sample provide an example of Complex type (DynamicComplexNumber.cs).
Anonymous
October 16, 2008
A while back I published a post about dynamic programming with WCF using the dynamic proxy library thatAnonymous
October 17, 2008
First, i must thank u for this great work!!! I have a question: How can i call my service's Methods asynchronously? i want to use asynchronous operations by using this Library(Dynamic Proxy) but i haven't found any way. Could u help me .... thanks RahmanAnonymous
October 19, 2008
Hi, I Solved My Problem!! I changed the Library's Code and by that, asynchronous Operations generate Dynamically! i will published the changed library in the CodeProject Site very Soon. I Hope it will be useful ... R. KhanipourAnonymous
October 31, 2008
Good morning, I have tested your client with my application and have gotten data back from the database. the issue... my configuration files from app.config are not being read. the one which is complaining is maxreceivedmessagesize. unfortunately it is set to default of 65536. How can I get more data than this on a call to the database. thank you for any assistance. rick. You may respond also to rwatson@ogleveeltd.comAnonymous
February 20, 2009
Hi Vipul, How can I get my Properties in a Complex Type reconstructed in the Proxy code. Using the current code, the property names are replaced by their corresponding private variables in the proxy code. Thanks, VikasAnonymous
March 09, 2009
I have a similar issue. I have xyz WCF Service that inherits from xyzBase. xyzBase has a property that I want to access. When I create a proxy class no metadata is generated for the property that is defined in the base class. In other words, when I try: PropertyInfo fi = webService.GetType().GetProperty("ServiceHeaderValue"); it cannot find the ServiceHeaderValue propery. When I use traditional ASP.NET service this works fine. I can see using Lutz Reflector that the property is being exposed .. it just doesn;t seem to make it into the proxy class genertaed by svcutil.exe. Any ideas would be greatly appreciated.Anonymous
March 12, 2009
Hi Vipul Is it possible to pass a cookie to the dynamic proxy before calling the invokeMember function. I am having trouble accessing an endpoint that needs to have authentication (We are implementing SSO). Many thanks for your help. Kind RegardsAnonymous
March 16, 2009
Hi Vipul, I was able to extract the the input parameters to "MyMethod" function by doing the following: DynamicProxy _dp = _dpf.CreateProxy(endpoint); Type proxyType = _dp.ProxyType; MethodInfo method = proxyType.GetMethod("MyMethod"); ParameterInfo[] inputParameters = method.GetParameters(); My output parameter is complex structure represented in the WSDL by the xml bellow. I am not sure how I can retrieve the type and name of each output parameter within the complex one! <s:complexType name="ProcessStats"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="accessDenied" type="s:boolean"/> <s:element minOccurs="1" maxOccurs="1" name="isRunning" type="s:boolean"/> <s:element minOccurs="1" maxOccurs="1" name="processID" type="s:int"/> <s:element minOccurs="0" maxOccurs="1" name="processName" type="s:string"/> <s:element minOccurs="1" maxOccurs="1" name="totalRunTime" type="s:double"/> <s:element minOccurs="0" maxOccurs="1" name="errorDescription" type="s:string"/> </s:sequence> </s:complexType> The same is true for complex input parameters! Do you know if there is a clear way to do this? Thank you very much.Anonymous
March 19, 2009
Hi Vipul; Thanks For your Post. can you please help me to solve one issue. I am using dynamicproxy dll in my client application, when I run my client application and try to invoke some services(WCF) its showing error saying that "The maximum message size quota for incoming messages (65536) has been exceeded. To increase the quota, use the MaxReceivedMessageSize property on the appropriate binding element." I google for this error and get a fix,When we add a service in our client Application it created binding configuration there we need to change MaxReceivedMessageSize. my question is how we change MaxReceivedMessageSize value in DynamicProxyAnonymous
April 03, 2009
WSHttpBinding b = new WSHttpBinding(SecurityMode.None); b.MessageEncoding = WSMessageEncoding.Mtom; b.TransferMode = TransferMode.Streamed; b.ReaderQuotas.MaxStringContentLength = 99999; still i get error when i pass large data. Help neededAnonymous
July 12, 2009
Can you provide example on how to create an instance of a custom DataMember class and use it within the Proxy?Anonymous
August 28, 2009
Works great, but I need to customize binding because my service host is Java based. I tried to change factory.Bindings and add extra behaviors to factory.Endpoints, but they don't seem to be changing anything in the Proxy?Anonymous
October 28, 2009
How to connect to WCF web services and by passing complex data object?Anonymous
February 26, 2010
Hi, I tried using the dynamicproxy in my code, i am currently facing an issue, when i try to pass a DataContract object i am getting Missing Method Exception thrown from the CallMethod function, tried googling but couldn't find a solution to the same, it seems that the invokemember of reflection class is throwing the error, but i couldn't get a concrete solution. Any helps appretiatedAnonymous
March 04, 2010
Hi Vipul, I have similar question to others concerning setting MaxReceivedMessageSize value in DynamicProxy. I tried different things but they don't seem to make any difference. Your help is appreciated. If you can give us a code snippet that will be great.Anonymous
March 11, 2010
The comment has been removedAnonymous
March 16, 2010
I have made a simple addition to the Dynamic Proxy project, added a new class DynamicProxyClass which inherits from Dynamic Object, modified the GetType function in the class to public static Type GetType(Assembly assembly, string TypeName) { return assembly.GetType(TypeName, true, true); } sending the type from outside rather than hard-coding it. so for creating an object doing something like this DynamicProxyClass requestProxy = new DynamicProxyClass(factory.ProxyAssembly, CLASS.GetType().ToString()); more info on this @ http://dvij.blogspot.com/2010/03/implementing-dynamic-proxy-in-wcf.htmlAnonymous
April 12, 2010
How do you build the WSDL string("http://localhost:8080/WcfSamples/DynamicProxy?wsdl"); what does WcfSamples signify, Can I choose any name? Then do I need to specify "DynamicProx?wsdl"?Anonymous
August 10, 2010
@vikas make sure you call your method using the correct params (count and type).Anonymous
September 15, 2010
hi, vipul. i am using your tool. it is very good. But i am in very big problem that is "how can i pass UserName and password by using your tool. i am using wsHttpBinding". please help me. my email ID is "naresh_soni44@yahoo.com"Anonymous
October 17, 2010
Hi Vipul, how to pass ref and out parameters to/from WCF using Dynamic Proxy Class LibraryAnonymous
October 31, 2010
This daynamic proxy code is awesome! I've modified the DownloadMetadata function like this: EndpointAddress epr = new EndpointAddress(this.wsdlUri); MetadataExchangeClient mexC = new MetadataExchangeClient(new Uri(this.wsdlUri), MetadataExchangeClientMode.MetadataExchange); MetadataSet metaDataset = mexC.GetMetadata(); this.metadataCollection = new Collection<MetadataSection>(); foreach (MetadataSection mds in metaDataset.MetadataSections) { this.metadataCollection.Add(mds); } to allow downloading the metadata over a NetTCP MEX endpoint. What I'm trying to do now is allow generating a proxy with a callback fuction (to support a tcp duplex channel.) The code currently throws a DynamicProxyException("The constructor matching the specified parameter types is not found.") Ideally the code would be generated with a callback event that could be handled in the client application. Please let me know if anyone has already done this, or has a good approach to look into.Anonymous
February 08, 2011
This is an interesting idea. Is there a Silverlight version? You can achieve part of this functionality in Silverlight with a sample that I created here (obviously not as comprehensive as this solution though) christianfindlay.blogspot.com/.../dynamic-wcf-services-silverlight.htmlAnonymous
March 29, 2011
Thanks for that great work Vipul! How can I pass UserName and password by using your tool?Anonymous
March 30, 2011
I solved the credentials problem. DiscoveryClientProtocol disco = new DiscoveryClientProtocol(); disco.UseDefaultCredentials = false; disco.Credentials = new NetworkCredentials("userName", "password");Anonymous
May 29, 2011
Hey I am not able to build you project! How do i start off :/Anonymous
June 23, 2011
This stuff is cool... but i am not able to run it yet. When i try to expose methods in my Service it si showing error method name not found. I am working on WCF Workflow service which is hosted in IIs. Do your code support xamlx?Anonymous
July 23, 2011
Hi Vipul, Is there a way to invoke methods on a asmx service dynamically using your libraryAnonymous
October 12, 2011
have you try it on WCF 4 Workflow Services ? its got error Method not found, I'm sure the method exist.Anonymous
November 02, 2011
Great little tool. I would like to be able to use it with a service over SSL. Where in your code should I load the client X509 cert? I tried disco.ClientCertificates.Add(cert); but that didn't work.Anonymous
March 21, 2012
How to specify the collection Type I need Collection type as List not as arrayAnonymous
July 26, 2012
Hello sir,Nice post.i am novice in WCF programming.when i call my service using Dynamic Proxy class,it gives me an error on call method."Method Not found".despite i am passing correct method nameAnonymous
October 30, 2012
Vipul your work is just awesome but how can we get the types of method parameters and handle complex types using wsdl can you show us a sample example it would be really helpful.Anonymous
November 14, 2012
Modification made to the DynamicProxy.Close() method. Before the modification some exceptions were hidden and replaced with. The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state public class DynamicProxy { public void Close() { var state = GetProperty("State") as CommunicationState?; if (state.HasValue && state.Value == CommunicationState.Opened) { CallMethod("Close"); } }Anonymous
January 24, 2013
Anyone here solved the "Method not found" issue? I'm sure the method exists. However why do I get that issue?Anonymous
April 24, 2013
Hi, Thanks for this amazing code!! I get an error when I use the DynamicProxy.SetProperty Method. Any idea how to resolve it?Anonymous
April 25, 2013
The comment has been removedAnonymous
May 28, 2013
Hi Vipul, I am creating a Dynamic wcf test client. when I browsed in net I found most of the people talking about you and your code. It is very important project for me. can you share your code with me. I need some guidance because I am new to wcf but I am trying my level best to do. So please guide me dude.Anonymous
May 30, 2013
Firstly: Amazing work :) Secondly: It seems to only return the first message body member instead of returning the response message (as I would prefer). How do I change this (I don't mind getting my hands dirty in the source)? Also, how do I perform authorisation? ThanksAnonymous
July 18, 2013
When we pass Custom object as parameter, it is giving error method not found. Please help us.Anonymous
September 05, 2013
Hi, i´m also facing missing method exception. Anyone knows how to fix it? TKSAnonymous
September 16, 2013
Hello Vijay / luiz For that ObjectInstance to be used like.. proxy.CallMethod("methodName", DynamicObj.ObjectInstance);Anonymous
November 12, 2013
The comment has been removedAnonymous
January 13, 2014
Hi, great work! How can i peform authentication? Tks!Anonymous
February 27, 2014
The comment has been removedAnonymous
May 11, 2014
HI, Its working Great but when I pass a custom object as a parameter, its throwing exception can any body place an example how to call a Service method with CustomClass as a Parameter, Its urgent Thanks in AdvanceAnonymous
May 28, 2014
Hi, It looks like all the links stoped working. Is there any other place where I can download library from ?Anonymous
November 15, 2014
Hi Vipul, Thanks for this excellent post. I have one problem though. If my wsdl is such that I have ReplyAction = * in OperatonContract, then while calling any of the method, it throws me the error "Method not found". If I add that service reference to my client, everything works fine, I also added a code to show the method names inside the proxy, I am able to find the function to be called. I further researched this problem and found that there is some issue with ReplyAction = *. The WSDL to be called is a third party wsdl and I have no control to change the corresponding ReplyAction property. Are you aware of any such problem. Any help in this regard would be appreciated. Thanks in advance NareshAnonymous
December 16, 2015
Hi Vipul, Is it possible to get the project sources? The download page seems to be inaccessible.Anonymous
December 18, 2015
Is the code still available. Download link seems to be brokenAnonymous
March 04, 2016
The download page seems to be inaccessible. Is there another link avaiable? Thank