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:
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 ints)
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";
}
}