0

我正在制作一个 php/c# 控制台应用程序/c#soap 服务,并且我在 Web 服务中创建了许多函数,但我无法调用其中一个。

我正在调用的函数是一个从数据库中获取字符串值的函数。该调用在 Windows 上运行良好(使用 localhost),但是当将它放到在单声道下运行的 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();
    }
}

下面的截图证明了 web 方法在 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;
    }
}

我不明白为什么这不起作用,我猜我可能错过了一些非常简单但找不到的东西。

感谢您的任何帮助,您可以提供。

4

1 回答 1

0

我刚刚找到原因,但我不明白为什么这不会影响方法。

基本上,我将 WSDL 设置为服务器的 IP 地址(即使它是服务器本地的),所以我输入了http://192.168.1.74/MySoapService.asmx但是如果我将其更改为http://localhost/MySoapService.asmx它可以正常工作。

为什么我需要将其设置为 localhost 而不是 IP 地址才能使这些服务正常工作。

是不是因为我一个接一个地运行了几个肥皂请求,所以浏览器正在停止它,我在尝试解决问题时确实注意到 Chrome 表示它正在节流,如果这是问题,那么我会本来以为连接会超时,不是说服务无效。

更新 我现在发现了为什么将 url 从 IP 更改为 localhost 解决了这个问题,我意识到另一个函数开始有同样的问题,后来意识到如果这个选项在 php.ini 中被禁用,php 默认缓存 wsdl。 ini 文件并重新启动 apache 服务器,然后它就可以正常工作了。在生产环境中可能非常有用,但在开发时有点痛苦。

于 2012-08-05T13:48:02.677 回答