Passing custom object to web service
-
Exactly!!! How can I get these to be the same? Surely it shouldn't be too difficult to just send an object with only a couple of string in it!
that's what I'm talking about with referencing a dll... create a dll (let's call it A) put the definition of the class Hello in A in your exe reference A use A.Hello everywhere in your code in you webservice reference A use A.Hello everywhere in your code because the full assembly name is A.hello...when you pass A.hello to your webservice it will see that A.Hello = A.Hello and accept the object as being the same... -
-
that's what I'm talking about with referencing a dll... create a dll (let's call it A) put the definition of the class Hello in A in your exe reference A use A.Hello everywhere in your code in you webservice reference A use A.Hello everywhere in your code because the full assembly name is A.hello...when you pass A.hello to your webservice it will see that A.Hello = A.Hello and accept the object as being the same... -
-
Thanks for you help so far. I have compiled the class into a dll and placed it into the bin directory. Now what do I do with it?
i'll assume your exe and your webservice are in the same solution add the dll project to the solution in your exe project, do an add reference and point to the dll project - don't move the dll to the bin when you compile the dll will come along automatically when you compile in your webservice project, do an add reference and point to the dll project - don't move the dll to the bin when you compile the dll will come along automatically when you compile
-
Thanks for you help so far. I have compiled the class into a dll and placed it into the bin directory. Now what do I do with it?
-
Okay I have imported it into both projects so they are both using the dll. But it still says "namespace.classname can not be converted to web_service_name.classname" Same problem as before.
Did you remove the old class definitions from your code?
A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007 -
Okay I have imported it into both projects so they are both using the dll. But it still says "namespace.classname can not be converted to web_service_name.classname" Same problem as before.
-
Did you remove the old class definitions from your code?
A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007 -
are you using web reference or going after the webservice dynamically? if web reference -- try to remove the reference and re-add it...
-
I am adding a web reference to it. I have removed it, recompiled the service and added it again and still has the same problem.
Well I have managed to achieve what I want to but in a pretty crude way. I have written a function to serialize a class and one to deserialize it. Like this -
Public Function Object2XML(ByVal obj As Object) As String Dim SW As New StringWriter Dim Ser As New XmlSerializer(obj.GetType()) Try Ser.Serialize(SW, obj) Return SW.ToString Catch ex As Exception Throw ex End Try End Function Public Function XML2OBject(ByVal xml As String, ByVal Type As Type) As Object Dim Obj As New Object Dim SR As New StringReader(xml) Dim Serializer As New System.Xml.Serialization.XmlSerializer(Type) Try Return Serializer.Deserialize(SR) Catch ex As Exception Throw ex End Try End Function
But surely there is a better way to do it than this? -
I am adding a web reference to it. I have removed it, recompiled the service and added it again and still has the same problem.
-
if you want, you can email your solution and I can take a quick look (strip out any unnecessary code)
-
Thats a very kind offer but It is as very large project and I can't strip it easily. Don't think my boss would appreciate me sending you the whole of our site. Thanks anyway. Have you managed to pass a custom class to a web service before successfully?
-
yes we do it all the time. we do not however use web references (not that I think that's the problem). we go after the webservice dynamically...
-
example: include system.web.services in your exe project make the webservice (if not already) a virtual directory the line - Me.Url = "http://localhost/cpwebproj/PopulateMyObj.asmx" allows you to change localhost to any ip/dns name hope this helps... ********this goes in your dll*********** _ Public Class MyObj Public sName As String Public sAddr As String Public sCity As String Public sState As String Public sZip As String End Class ********this goes in your exe*********** Public Class Form1 Inherits System.Windows.Forms.Form Private Sub Form1_Load1(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim oEntity As New CPDllProj.MyObj Dim oTrans As New Trans oEntity = oTrans.Request(oEntity) MsgBox(oEntity.sName) MsgBox(oEntity.sAddr) MsgBox(oEntity.sCity) MsgBox(oEntity.sState) MsgBox(oEntity.sZip) End End Sub end class Imports System.Web.Services Imports System.Web.Services.Protocols _ Public Class Trans Inherits System.Web.Services.Protocols.SoapHttpClientProtocol _ Public Function Request(ByVal oEntity As CPDllProj.MyObj) As CPDllProj.MyObj Dim oa() As Object Me.Url = "http://localhost/cpwebproj/PopulateMyObj.asmx" Me.Timeout = 60000 oa = Me.Invoke("Request", New Object() {oEntity}) Return CType(oa(0), CPDllProj.MyObj) End Function End Class ********this goes in your webservice*********** Imports System.Web.Services _ Public Class PopulateMyObj Inherits System.Web.Services.WebService #Region " Web Services Designer Generated Code " Public Sub New() MyBase.New() 'This call is required by the Web Services Designer. InitializeComponent() 'Add you
-
example: include system.web.services in your exe project make the webservice (if not already) a virtual directory the line - Me.Url = "http://localhost/cpwebproj/PopulateMyObj.asmx" allows you to change localhost to any ip/dns name hope this helps... ********this goes in your dll*********** _ Public Class MyObj Public sName As String Public sAddr As String Public sCity As String Public sState As String Public sZip As String End Class ********this goes in your exe*********** Public Class Form1 Inherits System.Windows.Forms.Form Private Sub Form1_Load1(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim oEntity As New CPDllProj.MyObj Dim oTrans As New Trans oEntity = oTrans.Request(oEntity) MsgBox(oEntity.sName) MsgBox(oEntity.sAddr) MsgBox(oEntity.sCity) MsgBox(oEntity.sState) MsgBox(oEntity.sZip) End End Sub end class Imports System.Web.Services Imports System.Web.Services.Protocols _ Public Class Trans Inherits System.Web.Services.Protocols.SoapHttpClientProtocol _ Public Function Request(ByVal oEntity As CPDllProj.MyObj) As CPDllProj.MyObj Dim oa() As Object Me.Url = "http://localhost/cpwebproj/PopulateMyObj.asmx" Me.Timeout = 60000 oa = Me.Invoke("Request", New Object() {oEntity}) Return CType(oa(0), CPDllProj.MyObj) End Function End Class ********this goes in your webservice*********** Imports System.Web.Services _ Public Class PopulateMyObj Inherits System.Web.Services.WebService #Region " Web Services Designer Generated Code " Public Sub New() MyBase.New() 'This call is required by the Web Services Designer. InitializeComponent() 'Add you
-
maybe, maybe not... do this and I'll show you how I got the code I sent: +add a webrefence to your asmx page. +right-click on the new reference and left-click on view in object browser +expand the plus +right-click on your class name +left-click on goto definition if you look the upper part of the code, its your routine name showing it's pointing to localhost. this is the code I sent you...
-
maybe, maybe not... do this and I'll show you how I got the code I sent: +add a webrefence to your asmx page. +right-click on the new reference and left-click on view in object browser +expand the plus +right-click on your class name +left-click on goto definition if you look the upper part of the code, its your routine name showing it's pointing to localhost. this is the code I sent you...