Groups | Blog | Home
all groups > dotnet web services > october 2007 >

dotnet web services : Help with returning a C# object from a web service



rbjorkquist
10/17/2007 10:33:29 AM
This is my first attempt at writing/using web services, so any and all
comments will be greatly appreciated. With that said, I am also by no
means saying this is the correct either.

I have noticed that when returning a new TPastePart, created and
filled by the web service, that if the "PastePartID" and "PastePart"
properties do not have "set" accessor methods, their respective data
is not returned, even though the object has contains that
information. So my solution, not one I like mind you, is to put in a
blank "set" method for each.

I have to main questions. First, why does this happen; and secondly,
what's the most appropriate way of doing this?

Thanks in advance,

Randel

//
************************************************************************
public class TPastePart{
//----------------------------------------------------------------------
private int FPastePartID;
private string FPastePart;
private string FPastePartNumber;
private string FPastePartDescription;

//----------------------------------------------------------------------
public TPastePart(){
FPastePartID = 0;

FPastePart = "";
FPastePartNumber = "";
FPastePartDescription = "";
}

//----------------------------------------------------------------------
public TPastePart(int PastePartID, string PastePartNumber,
string PastePartDescription, string PastePart){

FPastePartID = PastePartID;

FPastePart = PastePart;
FPastePartNumber = PastePartNumber;
FPastePartDescription = PastePartDescription;
}

//----------------------------------------------------------------------
public int PastePartID{
get{return(FPastePartID);}
set{}
}

//----------------------------------------------------------------------
public string PastePart{
get{return(FPastePart);}
set{}
}

//----------------------------------------------------------------------
public string PastePartNumber{
get{return(FPastePartNumber);}

set{
FPastePartNumber = value;
FPastePart = FPastePartNumber + " " + FPastePartDescription;
}
}

//----------------------------------------------------------------------
public string PastePartDescription{
get{return(FPastePartDescription);}

set{
FPastePartDescription = value;
FPastePart = FPastePartNumber + " " + FPastePartDescription;
}
}
}

//
************************************************************************
//***** WEB SERVICE
******************************************************
//
************************************************************************
//-----------------------------------------------------------------------
[WebMethod(Description="Retrieve the information for the given paste
part ID.")]
public TPastePart PastePart_Get(int PastePartID){
TPastePart PastePart = null;
ConnectionStringSettings Cs =
ConfigurationManager.ConnectionStrings["ECS"];

SqlConnection SqlCon = new SqlConnection();
SqlCommand SqlCmd = new SqlCommand();
SqlDataReader SqlReader = null;

try{
SqlCmd.CommandText = "ccisp_PastePart_Get";
SqlCmd.CommandType = CommandType.StoredProcedure;
SqlCmd.Connection = SqlCon;
SqlCmd.Parameters.Add(new SqlParameter("@RETURN_VALUE",
SqlDbType.Int,
4,

ParameterDirection.ReturnValue,
true,
((System.Byte)(10)),
((System.Byte)(0)),
"",
DataRowVersion.Current,
null));

SqlCmd.Parameters.Add(new SqlParameter("@PastePartID",
SqlDbType.Int,
4,
ParameterDirection.Input,
false,
((System.Byte)(10)),
((System.Byte)(0)),
"",
DataRowVersion.Current,
PastePartID));

SqlCon.ConnectionString = (string)Cs.ConnectionString;
SqlCon.Open();
SqlReader = SqlCmd.ExecuteReader();

if(SqlReader.HasRows){
SqlReader.Read();

PastePart = new TPastePart(SqlReader.GetInt32(0), //
PastePartID
SqlReader.GetString(1), //
PastePartNumber
SqlReader.GetString(2), //
PastePartDescription
SqlReader.GetString(3)); //PastePart
}//END IF-STATEMENT "if(SqlReader.HasRows)"
}//END TRY-BLOCK
catch(Exception E){
HandleWebException(E);
}//END CATCH-BLOCK
finally{
SqlCon.Close();
}//END FINALLY-BLOCK

return(PastePart);
}

//
************************************************************************
//***** WEB SERVICE RESULTS
**********************************************
//
************************************************************************

//WITH "set" ACCESSOR
METHOD**********************************************
<TPastePart>
<PastePartID>1</PastePartID>
<PastePart>46-141 7% Platinum Paste</PastePart>
<PastePartNumber>46-141</PastePartNumber>
<PastePartDescription>7% Platinum Paste</PastePartDescription>
<PasteViscosityID>1</PasteViscosityID>
</TPastePart>
//
************************************************************************

//WITH OUT "set" ACCESSOR METHOD
*****************************************
<TPastePart>
<PastePartNumber>46-141</PastePartNumber>
<PastePartDescription>7% Platinum Paste</PastePartDescription>
<PasteViscosityID>1</PasteViscosityID>
</TPastePart>
//
************************************************************************
rbjorkquist
10/17/2007 1:02:50 PM
On Oct 17, 12:52 pm, "John Saunders [MVP]" <john.saunders at
[quoted text, click to view]

Hey John,

Thanks for the quick response. But just to make sure I'm
understanding what you are saying. Just add a blank setter method,
like I'm doing is ok? There will be no ill side affects? And, why if
I leave it blank, does it know how to give me the rest of the data? I
mean, I'm not telling it or doing anything special. Actually, I'm not
doing anything.

Thanks again,

Randel
John Saunders [MVP]
10/17/2007 1:52:15 PM
[quoted text, click to view]

You've found it. Add the setter.

This is a requirement of XML serialization. You'd have to ask Microsoft why
they require it.
--
--------------------------------------------------------------------------------
John Saunders | MVP - Windows Server System - Connected System Developer

John Saunders [MVP]
10/22/2007 8:38:13 PM
[quoted text, click to view]

Hey John,

Thanks for the quick response. But just to make sure I'm
understanding what you are saying. Just add a blank setter method,
like I'm doing is ok? There will be no ill side affects? And, why if
I leave it blank, does it know how to give me the rest of the data? I
mean, I'm not telling it or doing anything special. Actually, I'm not
doing anything.
----------
Yes, just leave a blank setter. This is just a restriction of the
serializer. As long as you don't need to deserialize that type, you'll be ok
with a setter that does nothing.
--
--------------------------------------------------------------------------------
John Saunders | MVP - Windows Server System - Connected System Developer

Spam Catcher
10/23/2007 2:29:53 AM
rbjorkquist <rbjorkquist@coilcraft.com> wrote in
news:1192651370.735507.88330@t8g2000prg.googlegroups.com:

[quoted text, click to view]

You can even set the set to private...

As long as you're not serializing the object BACK to the server, I believe
you can have a private settor.

AddThis Social Bookmark Button