WCF will not return an int

前端 未结 3 1863
别跟我提以往
别跟我提以往 2020-12-06 19:52

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:



        
3条回答
  •  渐次进展
    2020-12-06 20:21

    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";
        }
    }
    

提交回复
热议问题