可以,在C#winform中消耗php soapserver

时间:2015-01-18 07:46:49

标签: php wsdl soapserver

我有一个简单的php soapserver,我也为它创建了一个wsdl文件。我可以在php中使用它但我想在.net winform中使用它。我搜索了它但没有一条建议的文章是有用的。你能帮我吗? 这是我的soapserver,页面名称是testserver.php:

class TestClass
{
    function hello($someone) 
    {
        return "Hello " . $someone . " Welcome To Wsdl World!";
    }
    function SumData($a,$b) 
    {
        //return "this is test";
        return $a+$b;
    } 
}
   ini_set("soap.wsdl_cache_enabled", "0"); 
   $server = new SoapServer("http://localhost/webservices/simple/test1.wsdl",array('soap_version' => SOAP_1_2));
   $server->setClass('TestClass');
   $server->handle(); 
?>

这是我的wsdl文件,文件名是test1.wsdl:

<?xml version="1.0"?>
<wsdl:definitions name="MyDefinition"
                  targetNamespace="urn:myTargetNamespace"
                  xmlns:tns="urn:myTns"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                  xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
                  xmlns="http://schemas.xmlsoap.org/wsdl/" >


    <wsdl:message name="sumincoming">
        <wsdl:part name="reqParam1" type="xsd:int"/>
        <wsdl:part name="reqParam2" type="xsd:int"/>
    </wsdl:message>

    <wsdl:message name="sumoutgoing">
        <wsdl:part name="resParam" type="xsd:string"/>
    </wsdl:message>


    <wsdl:message name="helloincoming">
        <wsdl:part name="name" type="xsd:string"/>
    </wsdl:message>

    <wsdl:message name="hellooutgoing">
        <wsdl:part name="response" type="xsd:string"/>
    </wsdl:message>

    <wsdl:portType name="MyPortType">
        <wsdl:operation name="SumData">
            <wsdl:input message="tns:sumincoming"/>
            <wsdl:output message="tns:sumoutgoing"/>
        </wsdl:operation>

        <wsdl:operation name="hello">
            <wsdl:input message="tns:helloincoming"/>
            <wsdl:output message="tns:hellooutgoing"/>
        </wsdl:operation>
    </wsdl:portType>



    <wsdl:binding name="MyBinding" type="tns:MyPortType">
        <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="SumData">
            <soap12:operation soapAction=""/>
            <wsdl:input>
                <soap12:body use="literal" namespace="urn:myInputNamespace" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal" namespace="urn:myOutputNamespace" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </wsdl:output>
        </wsdl:operation>

        <wsdl:operation name="hello">
            <soap12:operation soapAction=""/>
            <wsdl:input>
                <soap12:body use="literal" namespace="urn:myInputNamespace" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal" namespace="urn:myOutputNamespace" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </wsdl:output>
        </wsdl:operation>

    </wsdl:binding>

    <wsdl:service name="MyService">
        <!--<documentation>Returns a greeting string.</documentation>-->
        <wsdl:port name="MyPort" binding="tns:MyBinding">
            <soap12:address location="http://localhost/webservices/simple/testserver.php"/>
        </wsdl:port>
    </wsdl:service>

</wsdl:definition>

提前感谢!

1 个答案:

答案 0 :(得分:0)

在visual studio中,如果右键单击该项目并选择Add - &gt;服务参考...将wsdl地址放在Address字段中,visual studio应该创建用于调用php soap服务器的对象。

基于该示例的wsdl地址将是

http://localhost/webservices/simple/test1.wsdl

Visual Studio将显示服务列表:

MyPortType
MyService

在我的端口类型下应列出两个操作

SumData
hello

您的wsdl文件需要一些更正。

  1. 您需要定义wsdl名称空间

    的xmlns:WSDL = “http://schemas.xmlsoap.org/wsdl/”

  2. targetNamespace需要匹配与xmlns相同的值:tns

  3. 以下是更正后的wsdl文件。

    <?xml version="1.0"?>
    <wsdl:definitions targetNamespace="urn:myTns"
                  xmlns:tns="urn:myTns"
                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                  xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
                  xmlns="http://schemas.xmlsoap.org/wsdl/">
    
    <wsdl:message name="sumincoming">
        <wsdl:part name="reqParam1" type="xsd:int"/>
        <wsdl:part name="reqParam2" type="xsd:int"/>
    </wsdl:message>
    
    <wsdl:message name="sumoutgoing">
        <wsdl:part name="resParam" type="xsd:string"/>
    </wsdl:message>
    
    
    <wsdl:message name="helloincoming">
        <wsdl:part name="name" type="xsd:string"/>
    </wsdl:message>
    
    <wsdl:message name="hellooutgoing">
        <wsdl:part name="response" type="xsd:string"/>
    </wsdl:message>
    
    <wsdl:portType name="MyPortType">
        <wsdl:operation name="SumData">
            <wsdl:input message="tns:sumincoming"/>
            <wsdl:output message="tns:sumoutgoing"/>
        </wsdl:operation>
    
        <wsdl:operation name="hello">
            <wsdl:input message="tns:helloincoming"/>
            <wsdl:output message="tns:hellooutgoing"/>
        </wsdl:operation>
    </wsdl:portType>
    
    
    
    <wsdl:binding name="MyBinding" type="tns:MyPortType">
        <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="SumData">
            <soap12:operation soapAction=""/>
            <wsdl:input>
                <soap12:body use="literal" namespace="urn:myInputNamespace" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal" namespace="urn:myOutputNamespace" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </wsdl:output>
        </wsdl:operation>
    
        <wsdl:operation name="hello">
            <soap12:operation soapAction=""/>
            <wsdl:input>
                <soap12:body use="literal" namespace="urn:myInputNamespace" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal" namespace="urn:myOutputNamespace" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </wsdl:output>
        </wsdl:operation>
    
    </wsdl:binding>
    
    <wsdl:service name="MyService">
        <!--<documentation>Returns a greeting string.</documentation>-->
        <wsdl:port name="MyPort" binding="tns:MyBinding">
            <soap12:address location="http://localhost/webservices/simple/testserver.php"/>
        </wsdl:port>
    </wsdl:service>
    

    C#代码

    class Program
    {
        static void Main(string[] args)
        {
            PHPSoapClient.MyPortTypeClient client = new PHPSoapClient.MyPortTypeClient();
            Console.WriteLine(client.SumData(1, 2));
            Console.Read();
        }
    }