﻿/*
 * Copyright 2001-2013 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.18052
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------



[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://www.examples.com/wsdl/HelloService.wsdl", ConfigurationName="Hello_PortType")]
public interface Hello_PortType
{
    
    // CODEGEN: Generating message contract since the wrapper namespace (urn:examples:helloservice) of message sayHelloRequest does not match the default value (http://www.examples.com/wsdl/HelloService.wsdl)
    [System.ServiceModel.OperationContractAttribute(Action="sayHello", ReplyAction="*")]
    [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, Use=System.ServiceModel.OperationFormatUse.Encoded)]
    sayHelloResponse sayHello(sayHelloRequest request);
    
}

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(WrapperName="sayHello", WrapperNamespace="urn:examples:helloservice", IsWrapped=true)]
public partial class sayHelloRequest
{
    
    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=0)]
    public string firstName;
    
    public sayHelloRequest()
    {
    }
    
    public sayHelloRequest(string firstName)
    {
        this.firstName = firstName;
    }
}

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(WrapperName="sayHelloResponse", WrapperNamespace="urn:examples:helloservice", IsWrapped=true)]
public partial class sayHelloResponse
{
    
    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=0)]
    public string greeting;
    
    public sayHelloResponse()
    {
    }
    
    public sayHelloResponse(string greeting)
    {
        this.greeting = greeting;
    }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public interface Hello_PortTypeChannel : Hello_PortType, System.ServiceModel.IClientChannel
{
}

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public partial class Hello_PortTypeClient : System.ServiceModel.ClientBase<Hello_PortType>, Hello_PortType
{
    
    public Hello_PortTypeClient()
    {
    }
    
    public Hello_PortTypeClient(string endpointConfigurationName) : 
            base(endpointConfigurationName)
    {
    }
    
    public Hello_PortTypeClient(string endpointConfigurationName, string remoteAddress) : 
            base(endpointConfigurationName, remoteAddress)
    {
    }
    
    public Hello_PortTypeClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(endpointConfigurationName, remoteAddress)
    {
    }
    
    public Hello_PortTypeClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(binding, remoteAddress)
    {
    }
    
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    sayHelloResponse Hello_PortType.sayHello(sayHelloRequest request)
    {
        return base.Channel.sayHello(request);
    }
    
    public string sayHello(string firstName)
    {
        sayHelloRequest inValue = new sayHelloRequest();
        inValue.firstName = firstName;
        sayHelloResponse retVal = ((Hello_PortType)(this)).sayHello(inValue);
        return retVal.greeting;
    }
    
    
}
