1

これと同じ、Webフォームの1つにJSONPオートコンプリート機能を提供する必要があります: http://jqueryui.com/autocomplete/#remote-jsonp

基本的に、ユーザーが入力した検索語に一致する WCF サービスから返された値をドロップダウンに動的に入力したいと考えています。

WCF サービスが正常にヒットし、テキスト ボックスの内容が検索パラメーターとして正常に渡されます。Web サービスは返されますが、私は常に jQuery の「エラー:」ブロックに陥ります。

これは、私自身の WCF サービスを呼び出す、改造された jQuery (上記のリンクの AutoComplete サンプルから取得) です。

$("#txtModels").autocomplete({
    source: function (request, response) {
        $.ajax({
            url: "http://localhost:12345/webapi/models",
            dataType: "jsonp",
            data: {
                search: request.term
            },
            success: function (data) {
                alert("Success");  //never reach here
                //response($.map(data.models, function (item) {
                //   return {
                //        label: item.model,
                //        value: item.model
                //    }
                //}));
            },
            error: function() {
                alert("Error");  //always an error
            }
        });
    },
    minLength: 2,
    select: function (event, ui) {
        //log(ui.item ?
        //    "Selected: " + ui.item.label :
        //    "Nothing selected, input was " + this.value);
    },
    open: function () {
        //$(this).removeClass("ui-corner-all").addClass("ui-corner-top");
    },
    close: function () {
        //$(this).removeClass("ui-corner-top").addClass("ui-corner-all");
    }
});

これがWCFサービスです。ヒットし、エラーなしで戻ります。

[OperationContract]
[WebInvoke(Method = "GET",
            BodyStyle = WebMessageBodyStyle.Wrapped,  //tried ".Bare" also
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "models?search={search}")]
public string[] GetBoxSerialNums(string search)
{
    string[] models = new string[]{"Ford", "Chevy", "Honda"};
    return models;
}

WCF プロジェクトは、組み込みの WCF テンプレートを使用して作成されたため、web.config にはエンドポイント構成がありませんが、ここではとにかく:

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <!--removed-->
  </connectionStrings>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
  </system.webServer>

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    <standardEndpoints>
      <webHttpEndpoint>
        <!-- 
            Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
                        via the attributes on the <standardEndpoint> element below
        -->
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="false" maxReceivedMessageSize="10240000" maxBufferSize="10240000" />
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>

  <appSettings>
    <!--removed-->
  </appSettings>

</configuration>

私はjQuery/JSON、特にJSONPにまったく慣れていませんが、WebサービスがjQuery呼び出しで期待される形式でデータを返していないことは明らかです。この作業を行うには、何をする必要がありますか?

4

1 に答える 1

0

bindingsの中に追加して、web.config を変更しますsystem.serviceModel

<bindings>
  <webHttpBinding>
    <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
  </webHttpBinding>
</bindings>

bindingConfiguration="webHttpBindingWithJsonP"そして、あなたの<endpoint>タグに追加してください。

最後に、 と を削除して Web メソッドを変更しBodyStyleますUriTemplate

[WebInvoke(Method = "GET",
           //BodyStyle = WebMessageBodyStyle.Wrapped,  //tried ".Bare" also
           ResponseFormat = WebMessageFormat.Json
           //UriTemplate = "models?search={search}"
           )]
public string[] GetBoxSerialNums(string search)

これで、WCF サービスの応答は次のようになります。

jQuery16409075580490753055_1354078880656(["Ford","Chevy","Honda"]);

これは JSONP 要件に一致し、機能するはずです。

于 2012-11-28T05:14:47.830 に答える