0

WebMethod の呼び出しを介してオブジェクトのリストが取り込まれる jQuery UI Autocomplete ウィジェットがあります。

C#、.NET 4.0 を使用しています。

これは「私のマシンで動作します」 (ここに嘲笑の鼻声を挿入します) が、サーバーにデプロイすると、WebMethod が失敗したためにオートコンプリートが読み込まれません。IE DevTools のコンソール ウィンドウに次のエラーが表示されます。

Sys.Net.WebServiceFailedException: The server method 'SearchEmployees' failed with the following error: -- There was an error processing the request.    

Firebug からの WebMethod への POST への応答のエラーは次のとおりです。

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections.

私のページには、EnablePageMethods="true" の ScriptManager があります。

私のメソッドは公開されており、属性[ScriptMethod()][WebMethod]属性があります。

WebMethod で呼び出されるデータベースのアクセス許可を確認しました (まだ DB 呼び出しに到達していないため、問題点のようなものです)。

私が持っていることを確認しusing System.Web.Services;using System.Web.Script.Services;

IIS で特定の AppPool のターゲット フレームワークを確認しました。

私のjavascript/jQuery:

PageMethods.SearchEmployees(function (results) {
    $("#txtMessageFor").autocomplete({
        source: results,
        delay: 0,
        autoFocus: true,
        select: function (event, ui) {
            $('#hfEmployeeEmail').val(ui.item.Email);
        }
    });
});

CodeBehind の私の WebMethod:

[ScriptMethod()]
[WebMethod]
public static List<Employee> SearchEmployees()
{
    try
    {
        using (SqlConnection conn = new SqlConnection())
        {
            conn.ConnectionString = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.CommandText = "SELECT Name, Email FROM TableName";
                cmd.Connection = conn;
                conn.Open();
                List<Employee> contacts = new List<Employee>();
                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    while (sdr.Read())
                    {
                        Employee employee = new Employee();
                        employee.label = sdr["Name"].ToString();
                        employee.value = sdr["Name"].ToString();
                        employee.Name = sdr["Name"].ToString();
                        employee.Email = sdr["Email"].ToString();
                        contacts.Add(employee);
                    }
                }
                conn.Close();
                return contacts;
            }
        }
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

web.config の接続文字列

<connectionStrings>
    <add name="ConnStr" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\FakeDBName.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient" /> 
</connectionStrings>

では、デプロイ時に WebMethod が機能しない理由を教えてくれる人はいますか?

4

2 に答える 2

1

前に述べたように、それは SQL 例外である可能性があります。あなたがそれを見つけたので、何を確認するべきかを以下に示します。

「SQL Server への接続を確立しているときに、ネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないか、アクセスできませんでした。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。」

ここに短いヒントがあります:

7 確認しておきたいこと

ただし、メッセージの最後にあるコードを確認することをお勧めします。

于 2012-08-28T06:49:41.147 に答える
1

Firefox で fiddler または Firebug を使用して、Web サービスに送信されたリクエストのステータスを確認します。これらの両方のツールを使用すると、より良いアイデアが得られます。フィドラーの場合はインストールを行う必要があるため、最初にfirebugを使用してみることをお勧めします。

私があなたに与えたいもう1つの提案は、返す代わりに次のList<Employee>ようなものを返さなければならないということです:

public class ReturnEmployee
{
    public List<Employee> Employees {get; set;}

    public string ErrorMessage {get; set;}
}

このアプローチは、問題の特定に大いに役立ちます。

于 2012-08-28T06:08:36.323 に答える