WCF will not return an int

前端 未结 3 1834
别跟我提以往
别跟我提以往 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:14

    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.

    0 讨论(0)
  • 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";
        }
    }
    
    0 讨论(0)
  • 2020-12-06 20:33

    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);
    
    0 讨论(0)
提交回复
热议问题