我正在制作一个php / c#console app / c#soap服务,我在Web服务中创建了很多功能,但是我无法调用其中一个。
我调用的函数是一个从数据库中获取字符串值的函数。该调用在Windows上运行正常(使用localhost)但是当将它放到以mono运行的Linux服务器上时,我得到一个例外,说明如下:
函数(“getLastResetTime”)不是此服务的有效方法
奇怪的是,从Linux服务器我可以通过转到asmx文件访问测试表单并运行getLastResetTime函数并返回预期的内容,它似乎只是无法进行调用的PHP 。
以下是我在PHP中用来调用脚本的代码
function getLastResetTime()
{
include ("../../config.php");
include ("../../includes/get-settings.php");
include ("../../includes/general.php");
try
{
$client = new SoapClient("http://192.168.1.74/EmailServer/EmailSoapService/EmailSoapService.asmx?WSDL", array("trace" => 1, "exception" => 0));
$result = $client->__soapCall("getLastResetTime", array());
echo "Last Reset: " . $result->getLastResetTimeResult;
}
catch (Exception $e)
{
echo $e->getMessage();
}
}
下面的屏幕截图证明了网络方法在Mono下运行并返回了什么
以下是网络服务功能的代码
[WebMethod(Description = "Gets the time the Email Server last reset")]
public string getLastResetTime()
{
SoapHandler soapHandler = new SoapHandler();
return soapHandler.getLastResetTime();
}
及以下是Web服务调用的代码
public string getLastResetTime()
{
try
{
using (ConnectDb db = new ConnectDb(appSettings))
{
string query = "SELECT * FROM settings";
using (MySqlCommand cmd = new MySqlCommand(query, db.conn))
{
using (MySqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
if (reader.GetString("setting") == "app_lastRestart")
{
return reader.GetString("value");
}
}
}
}
}
return "N/A";
}
catch (MySqlException ex)
{
return ex.Message;
}
}
我不明白为什么这不起作用,我猜我可能遗漏了一些非常简单但却找不到的东西。
感谢您提供的任何帮助。
答案 0 :(得分:0)
我刚刚找到原因,但我不明白为什么这不影响方法。
基本上,我将WSDL设置为服务器的IP地址(即使它是服务器的本地地址),所以我放http://192.168.1.74/MySoapService.asmx
但是如果我将其更改为http://localhost/MySoapService.asmx
它的工作原理细
为什么我需要使用localhost而不是IP地址才能使这些服务正常工作。
是不是因为我一个接一个地运行几个soap请求,所以浏览器正在停止它,我确实注意到在我试图找出问题的时候,Chrome正在说它是限制的,如果这是问题然后我会认为连接会超时,而不是说服务无效。
<强>更新强> 我现在已经发现为什么将IP从IP更改为localhost修复了这个问题,我意识到另一个函数开始出现同样的问题后来才意识到php默认会缓存wsdl,如果在php.ini中禁用了这个选项文件并重新启动Apache服务器,然后工作正常。在生产环境中可能非常有用,但在开发时会有点痛苦。