简体   繁体   English

Web服务函数调用中的out参数问题

[英]Problem with out parameter in web service function call

I have the following function in my web service: 我的Web服务中有以下功能:

[WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
 public class Service1 : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";

        }

        [WebMethod]
        public void Login(string url, string id, out int ClientType, out int ClientID)
        {
            ClientID = 11;
            ClientType = 12;
        }
    }
}

On the client side I see it in object reference without the out parameter this is the whole code , I am interested in public void Login(string url, string id, out int ClientType, out int ClientID) , I just want to use in on the client side with as I see it on the server side.What changes I should do in the server that I will puslish It with out changes. 在客户端我看到它在对象引用中没有out参数这是整个代码,我对public void Login(string url, string id, out int ClientType, out int ClientID)感兴趣public void Login(string url, string id, out int ClientType, out int ClientID) ,我只是想在on中使用客户端,就像我在服务器端看到的那样。我应该在服务器上做什么改变,我会用它来改变它。

namespace ConsoleApplication1.ServiceReference1 {


    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(ConfigurationName="ServiceReference1.Service1Soap")]
    public interface Service1Soap {

        // CODEGEN: Generating message contract since element name HelloWorldResult from namespace http://tempuri.org/ is not marked nillable
        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/HelloWorld", ReplyAction="*")]
        ConsoleApplication1.ServiceReference1.HelloWorldResponse HelloWorld(ConsoleApplication1.ServiceReference1.HelloWorldRequest request);

        // CODEGEN: Generating message contract since element name url from namespace http://tempuri.org/ is not marked nillable
        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/Login", ReplyAction="*")]
        ConsoleApplication1.ServiceReference1.LoginResponse Login(ConsoleApplication1.ServiceReference1.LoginRequest request);
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
    public partial class HelloWorldRequest {

        [System.ServiceModel.MessageBodyMemberAttribute(Name="HelloWorld", Namespace="http://tempuri.org/", Order=0)]
        public ConsoleApplication1.ServiceReference1.HelloWorldRequestBody Body;

        public HelloWorldRequest() {
        }

        public HelloWorldRequest(ConsoleApplication1.ServiceReference1.HelloWorldRequestBody Body) {
            this.Body = Body;
        }
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.Runtime.Serialization.DataContractAttribute()]
    public partial class HelloWorldRequestBody {

        public HelloWorldRequestBody() {
        }
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
    public partial class HelloWorldResponse {

        [System.ServiceModel.MessageBodyMemberAttribute(Name="HelloWorldResponse", Namespace="http://tempuri.org/", Order=0)]
        public ConsoleApplication1.ServiceReference1.HelloWorldResponseBody Body;

        public HelloWorldResponse() {
        }

        public HelloWorldResponse(ConsoleApplication1.ServiceReference1.HelloWorldResponseBody Body) {
            this.Body = Body;
        }
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.Runtime.Serialization.DataContractAttribute(Namespace="http://tempuri.org/")]
    public partial class HelloWorldResponseBody {

        [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)]
        public string HelloWorldResult;

        public HelloWorldResponseBody() {
        }

        public HelloWorldResponseBody(string HelloWorldResult) {
            this.HelloWorldResult = HelloWorldResult;
        }
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
    public partial class LoginRequest {

        [System.ServiceModel.MessageBodyMemberAttribute(Name="Login", Namespace="http://tempuri.org/", Order=0)]
        public ConsoleApplication1.ServiceReference1.LoginRequestBody Body;

        public LoginRequest() {
        }

        public LoginRequest(ConsoleApplication1.ServiceReference1.LoginRequestBody Body) {
            this.Body = Body;
        }
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.Runtime.Serialization.DataContractAttribute(Namespace="http://tempuri.org/")]
    public partial class LoginRequestBody {

        [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)]
        public string url;

        [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)]
        public string id;

        public LoginRequestBody() {
        }

        public LoginRequestBody(string url, string id) {
            this.url = url;
            this.id = id;
        }
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
    public partial class LoginResponse {

        [System.ServiceModel.MessageBodyMemberAttribute(Name="LoginResponse", Namespace="http://tempuri.org/", Order=0)]
        public ConsoleApplication1.ServiceReference1.LoginResponseBody Body;

        public LoginResponse() {
        }

        public LoginResponse(ConsoleApplication1.ServiceReference1.LoginResponseBody Body) {
            this.Body = Body;
        }
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.Runtime.Serialization.DataContractAttribute(Namespace="http://tempuri.org/")]
    public partial class LoginResponseBody {

        [System.Runtime.Serialization.DataMemberAttribute(Order=0)]
        public int ClientType;

        [System.Runtime.Serialization.DataMemberAttribute(Order=1)]
        public int ClientID;

        public LoginResponseBody() {
        }

        public LoginResponseBody(int ClientType, int ClientID) {
            this.ClientType = ClientType;
            this.ClientID = ClientID;
        }
    }

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public interface Service1SoapChannel : ConsoleApplication1.ServiceReference1.Service1Soap, System.ServiceModel.IClientChannel {
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public partial class Service1SoapClient : System.ServiceModel.ClientBase<ConsoleApplication1.ServiceReference1.Service1Soap>, ConsoleApplication1.ServiceReference1.Service1Soap {

        public Service1SoapClient() {
        }

        public Service1SoapClient(string endpointConfigurationName) : 
                base(endpointConfigurationName) {
        }

        public Service1SoapClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }

        public Service1SoapClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }

        public Service1SoapClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress) {
        }

        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        ConsoleApplication1.ServiceReference1.HelloWorldResponse ConsoleApplication1.ServiceReference1.Service1Soap.HelloWorld(ConsoleApplication1.ServiceReference1.HelloWorldRequest request) {
            return base.Channel.HelloWorld(request);
        }

        public string HelloWorld() {
            ConsoleApplication1.ServiceReference1.HelloWorldRequest inValue = new ConsoleApplication1.ServiceReference1.HelloWorldRequest();
            inValue.Body = new ConsoleApplication1.ServiceReference1.HelloWorldRequestBody();
            ConsoleApplication1.ServiceReference1.HelloWorldResponse retVal = ((ConsoleApplication1.ServiceReference1.Service1Soap)(this)).HelloWorld(inValue);
            return retVal.Body.HelloWorldResult;
        }

        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        ConsoleApplication1.ServiceReference1.LoginResponse ConsoleApplication1.ServiceReference1.Service1Soap.Login(ConsoleApplication1.ServiceReference1.LoginRequest request) {
            return base.Channel.Login(request);
        }

        public int Login(string url, string id, out int ClientID) {
            ConsoleApplication1.ServiceReference1.LoginRequest inValue = new ConsoleApplication1.ServiceReference1.LoginRequest();
            inValue.Body = new ConsoleApplication1.ServiceReference1.LoginRequestBody();
            inValue.Body.url = url;
            inValue.Body.id = id;
            ConsoleApplication1.ServiceReference1.LoginResponse retVal = ((ConsoleApplication1.ServiceReference1.Service1Soap)(this)).Login(inValue);
            ClientID = retVal.Body.ClientID;
            return retVal.Body.ClientType;
        }
    }
}

Any idea why I dont see the out parameter there, and why I cannot use it? 知道为什么我没有在那里看到out参数,为什么我不能使用它?

With the help of John Saunders , thanks again , I know what to search . 在John Saunders的帮助下,再次感谢,我知道要搜索什么。

I have found this answer how to generate web service out of wsdl 我已经找到了这个答案如何从wsdl生成Web服务

And It was exactly what I needed . 这正是我所需要的。

I think this similar question might help you out. 我认为这个类似的问题可能对你有帮助。

Is it unusual for a web service call to have an "out" parameter? Web服务调用具有“out”参数是不寻常的吗?

Also, you could just make a struct or class that bundles up your two out parameters and returns it something like this. 此外,你可以创建一个结构或类来捆绑你的两个输出参数并返回类似这样的东西。

public class LoginResult
{
    public LoginResult(int clientType, int clientId)
    {
         ClientType = clientType;
         ClientID = clientId;
    }

    public int ClientType { get; set; };
    public int ClientID{ get; set; };
}

[WebMethod]        
public LoginResult Login(string url, string id)
{
    return new LoginResult( 11, 12 );      
}

It will be in the LoginResponseBody . 它将在LoginResponseBody IIRC the method will be modified on the client side so that it returns a value. IIRC将在客户端修改该方法,以便它返回一个值。 Or maybe inside LoginRequest . 或者也许在LoginRequest内部。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM