0

php / c#コンソールapp / c#SOAPサービスを作成していて、Webサービス内に多くの関数を作成しましたが、そのうちの1つを呼び出すことができません。

私が呼び出している関数は、データベースから文字列値を取得する関数です。この呼び出しは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();
    }
}

以下のスクリーンショットは、WebメソッドがMonoで機能していることと、それが返すものを証明しています。

ここに画像の説明を入力してください

以下はWebサービス機能のコードです

[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正常に機能します。

これらのサービスを機能させるには、なぜIPアドレスではなくローカルホストにする必要があるのでしょうか。

いくつかのsoapリクエストを次々に実行しているため、ブラウザが停止しているためです。問題を解決しようとしているときに、Chromeがスロットルしていると述べていることに気付きました。これが問題である場合は、サービスが無効であるとは言わずに、接続がタイムアウトするだろうと考えていました。

更新 URLをIPからローカルホストに変更すると問題が解決した理由がわかりました。別の関数で同じ問題が発生し始め、後でこのオプションがphpで無効になっている場合、phpがデフォルトでwsdlをキャッシュすることに気付きました。 iniファイルを作成してApacheサーバーを再起動すると、正常に動作します。おそらく実稼働環境では非常に便利ですが、開発時には少し苦労します。

于 2012-08-05T13:48:02.677 に答える