I am building a WCF in C#, and a client to consume it at the same time. For some reason I am having trouble getting a method to return an int. Here is my contract:
You import it as a Service Reference (with name space MData
) instead Web Reference.
And use the below code,
MDataClient m = new MDataClient();
String helloWorld = m.HelloWorld();
int result = m.ReturnAnInt();
There is nothing wrong in your code. It should works fine if you add Service Reference and use the above snippet.
Can you import it as a Service Reference (newer tech) instead of a Web Reference (older tech)? I work with WCF services through service references and haven't seen such an issue - I've only seen a Specified
property (and that as a property alongside the int
, not as two out
params) when the service definition allows no int
to be specified (WCF-generated service definitions have, in my experience, worked as expected).
If you can't find a better solution, here's a workaround using partial classes: (this would have to be done any time you return a struct
, not just int
s)
public partial class MData
{
public int ReturnAnInt()
{
int result;
bool specified;
this.ReturnAnInt(out result, out specified);
if (!specified) throw new InvalidOperationException();
return result;
}
}
Update http://www.codeproject.com/Articles/323097/WCF-ASMX-Interoperability-Removing-the-Annoying-xx has a (somewhat klunky) solution, and informs us that the root cause is that WCF generates poor (arguably inaccurate) WSDLs - they have a minOccurs="0"
on elements that really don't need it. Web References reads this as-is, and generates klunky code to deal with it, which is what you're trying to deal with. Based on his article, you can return this type instead of an int
:
[MessageContract(IsWrapped = false)]
public class MyInt
{
[MessageBodyMember]
public int Result { get; set; }
public static implicit operator MyInt(int i)
{
return new MyInt { Result = i };
}
public static implicit operator int(MyInt m)
{
return m.Result;
}
}
Along with modifying the return type of the method:
[ServiceContract]
public interface IMData
{
[OperationContract]
MyInt ReturnAnInt();
[OperationContract]
String HelloWorld();
}
public class Service1 : IMData
{
public MyInt ReturnAnInt()
{
return 4;
}
public string HelloWorld()
{
return "Hello World";
}
}
I had a similar issue, I could not get an out int
parameter of my web service to work. I am still not sure due to what this was exactly, but I had it working using a string
as out
parameter.
[OperationContract]
LoginStatus GetLogin(string username, string password, out string s_uId);
on the web service side:
s_uId = uId.ToString();
on the client side:
int uId;
string s_uId;
result = client.GetLogin(username, password, out s_uId);
Int32.TryParse(s_uId, out uId);