jQuery autocomplete und aufruf eines asmx webservice per get

Beschäftige mich aktuell intensiver mit dem System Umbraco. Dabei versuch ich einen Datentyp für die Administration zu entwicklen, der per AJAX Daten aus einer Datenbank lädt. Ein Datentyp in Umbraco ist z.B. ein Textfeld, Checkbox oder ähnliches um im Adminbereich das System mit Inhalten zu befüllen.

Bei meiner Suche bin ich dann auf ein jQuery-Plugin namens autocomplete aufmerksam geworden. Damit kann man eine Textbox via JavaScript mit einer autocomplete-Funktion erweitern. Da ich die Daten aber nicht per JSON direkt mit zum Client übertragen wollte, habe ich dafür einen asmx-Webservice geschrieben.

Die Einbindung via jQuery ist denkbar einfach und sieht in C# z.B. so aus:

        private void _BuildAutoCompletedScript()
        {

              StringBuilder clientScript = new StringBuilder();

              clientScript.Append(" <script type='text/javascript'>");
              clientScript.Append(" $(document).ready(function() { ");
              clientScript.AppendFormat("    $(\"#{0}\").autocomplete(   ",
                                           this.autoCompleteTextbox.ClientID); clientScript.Append(" \"/umbraco/webservices/api/mywebserive.asmx/mymethod\", "); clientScript.Append(" { delay:10, minChars:2,
                                       matchContains:1, cacheLength:10, autoFill:true } "); clientScript.Append(" ); "); clientScript.Append(" }); "); clientScript.Append(" </script>"); this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.ClientID +
                                        "_autocompleteData", clientScript.ToString()); this.Page.ClientScript.RegisterClientScriptInclude("jquery.autocomplete",
                                "/umbraco_client/Application/JQuery/jquery.autocomplete.js");
Auf der Serverseite wird dann eine Web-Servicemethode definiert:

    [WebService(Namespace = "uri:umbraco-irgendwas")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.Web.Script.Services.ScriptService]
    public class mywebservice : System.Web.Services.WebService
    {

        [WebMethod]
        public string mymethod(string q, int limit)
        {
            return "Hello World" + q;
        }
    }
Die Parameter q und limit wird vom Plugin automatisch beim Aufruf als Parameter übergeben. Dabei ist q der Inhalt aus dem Textfeld und limit ist die maximale Anzahl an Datensätzen, die zurück geliefert werden sollen.

So weit so einfach, doch leider habe ich beim Aufruf immer einen http-Fehlercode 500 bekommen. Die Lösung habe ich noch einiger Recherche dann gefunden.

Die web.config muss um folgendes ergänzt werden:

<webServices>
  <
protocols
>
    <
add name="HttpGet"
/>
    <
add name="HttpPost"
/>
    <
add name="HttpSoap"
/>
  </
protocols
>
</
webServices>


sonst kann der Web-Service nicht via GET aufgerufen werden.




Kommentar schreiben