ASP.NET/C#客户端如何调用PHP/MYSQL Web服务(WSDL)

6
我正在尝试访问一个网络服务(下面有两个文件)。客户端使用ASP.NET/C#构建他们的Web架构。我可以添加Web引用,但无论如何都不能为wsdl文件生成代理类。目的是使用server.php文件中的函数,以便可以使用xmlstring在ASP.NET网站上显示数据。如果您能提供任何帮助,将不胜感激。非常感谢。
server.php文件。该文件具有一个php函数,它从mysql数据库中提取数据,并将该函数作为XML字符串返回数据。
<?php
//WEB SERVICE FUNCTION TO EXTRACT DATA FROM CLIENT B INTO XML FORMAT
function getXML()
{
//CONNECT TO THE DATABASE SERVER
$dbserverIP = "xxxxxxx";
$dbusername = "xxxxxxx";
$dbpassword = "xxxxxxx";
$dbconnection = mysql_connect($dbserverIP,$dbusername,$dbpassword)  
or die ("The connection to the database server failed.");

//CONNECT TO THE DATABASE
$dbname = "xxxxxxxx";
$dbselectok = mysql_select_db($dbname,$dbconnection)
or die ("The connection to the database failed.");

//QUERY THE DATABASE
$sqlquery = "SELECT * FROM videogames";
$sqlresult = mysql_query($sqlquery,$dbconnection)
or die ("Error in executing the SQL statement");

//CREATE XML STRING
$xmlstring = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";
$xmlstring.= "<videogames>";

while ($row = mysql_fetch_array($sqlresult))
{
    $xmlstring .= "\t<game>\r\n";
        $xmlstring .= "\t\t<gametitle>" .$row["gametitle"]. "</gametitle>\r\n";
        $xmlstring .= "\t\t<genre>" .$row["genre"]. "</genre>\r\n";
        $xmlstring .= "\t\t<year>" .$row["year"]. "</year>\r\n";
        $xmlstring .= "\t\t<platform>" .$row["platform"]. "</platform>\r\n";
        $xmlstring .= "\t\t<agerating>" .$row["agerating"]. "</agerating>\r\n";
        $xmlstring .= "\t\t<price>" .$row["price"]. "</price>\r\n";
    $xmlstring .= "\t</game>\r\n";
}

$xmlstring.= "</videogames>";

//WRITE XML STRING TO EXTERNAL FILE
$filename = "videogames.xml";
$fileaccessmode = "w";
$fptr = fopen($filename,$fileaccessmode);
fwrite($fptr,$xmlstring);
fclose($fptr);

//FREE UP MEMORY
mysql_free_result($sqlresult);
mysql_close($dbconnection);

return $xmlstring;

}

//CODE TO DISABLE THE WSDLE CACHE
ini_set("soap.wsdl_cache_enabled","0");

//DEFINE SOAP SERVER INSTANCE AND RELATED WSDL FILE
//THE service.wsdl FILE IS IN THE SAME FOLDER AS THIS server.php FILE
$server = new SoapServer("service.wsdl");

//ADD FUNCTION TO THE SERVER INSTANCE
$server->addFunction("getXML");

//ACTIVATE THE SOAP HANDLER
$server->handle();

?>

这是与server.php文件链接的WSDL文件。
<?xml version ='1.0' encoding ='UTF-8' ?>

<!-- ====================== DEFINITIONS ====================== -->

<definitions name="MyWebService"
     targetNamespace="http://cet-apache-04.cet.bolton.ac.uk/student/mib1bee/CST3017/assignment/scenario1/service.wsdl"
     xmlns="http://schemas.xmlsoap.org/wsdl/"
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
     xmlns:tns="http://cet-apache-04.cet.bolton.ac.uk/student/mib1bee/CST3017/assignment/scenario1/service.wsdl"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<!-- ====================== TYPES ============================ -->
<!-- No need for type definitions as only xsd built-in ======= --> 
<!-- data types are used                                       -->
<!-- ========================================================= -->

<!-- ====================== MESSAGE ========================== -->

<message name="getXML_Request">
<part name="input" />
</message>

<message name="getXML_Response">
<part name="xmlString" type="xsd:string"/>
</message>

<!-- ====================== PORT TYPE ============================ -->

<portType name="myWebService_PortType">

<operation name="getXML">
   <input  message="tns:getXML_Request"/>
   <output message="tns:getXML_Response"/>
</operation>

</portType>

<!-- ======================= BINDING ============================= -->

<binding name="myWebService_Binding" type="tns:myWebService_PortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

<operation name="getXML">
   <input>
     <soap:body use="literal"/>
   </input>
   <output>
     <soap:body use="literal"/>
   </output>
</operation>

</binding>

<!-- ======================= SERVICE ============================= -->

<service name="myWebService_Service">
<port name="myWebService_Port" binding="tns:myWebService_Binding">
    <soap:address location="http://cet-apache-04.cet.bolton.ac.uk/student/mib1bee/CST3017/assignment/scenario1/server.php"/>
</port>
</service>

</definitions>

也许是因为我不是PHP-soap服务器专家,但我想知道你的XML何时被转换为带有特定soap标记的SOAP消息。你的WSDL声明了一个SOAP服务,但是你的响应似乎只是一个普通的XML。 - Dev.Jaap
所以要理解对,客户端是C#,服务器是PHP?还是反过来?如果你想为C#客户端生成代理类,那么在这样做时有什么错误? - valheru
在您的应用程序中创建客户端时,请提供代码。 - Harry89pl
我还没有解决这个问题。我已经创建了 Web 服务(简单的 hello world 字符串),但唯一的问题是当 ASP.NET/C# 客户端尝试使用该 Web 服务时,返回值始终为 null,原因不明。 - Muhammed Bhikha
你检查过服务器返回的XML代码了吗?在getXML函数内部写XML头部是否必要? - LSerni
3个回答

1

0
过去我曾经遇到过使用rpc/literal格式创建的Web服务在.Net中无法被调用的问题。尝试将你的WSDL转换为document/literal格式,你应该会有更好的运气。

0

你需要修复你的 WSDL:

<operation name="getXML">
    <soap:operation soapAction="urn:MyWebService#getXML"/>
   <input>
     <soap:body use="literal"/>
   </input>
   <output>
     <soap:body use="literal"/>
   </output>
</operation>

</binding>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接