2011-04-14 3 views
1

좋아, 난 내 웹 애플 리케이션에서 요청을 처리하고 JSONP 형식으로 응답하는 WCF 서비스를 사용하고 있습니다. 내가 찾은 모든 솔루션을 시험해보고 설명서 (http://msdn.microsoft.com/en-us/library/ee834511.aspx#Y200)와 예제 프로젝트를 공부했습니다.JSONP 대신 JSON에서 WCF 응답

문제는 응답 객체 (json)가 URL에 제공된 콜백으로 랩핑되지 않는다는 것입니다.

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <trace enabled="true"/> 
    <compilation debug="true" targetFramework="4.0"><assemblies><add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=*************" /></assemblies></compilation> 
    </system.web> 
    <system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <services> 
     <service name="RestService.socialApi"> 
     <endpoint address="" binding="webHttpBinding" contract="RestService.IsocialApi" bindingConfiguration="webHttpBindingJsonP" behaviorConfiguration="webHttpBehavior"> 
     </endpoint> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehaviour"> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true" /> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="webHttpBehavior" > 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <bindings> 
     <webHttpBinding>   
     <binding name="webHttpBindingJsonP" crossDomainScriptAccessEnabled="true"/> 
     </webHttpBinding> 
    </bindings> 
    <!--<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />--> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 
    <connectionStrings> 
    <add name="AsrAppEntities" connectionString="myconstring**********" /> 
    </connectionStrings> 
</configuration> 

그리고 내 OperationContract를 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 
using System.ServiceModel.Web; 
using System.IO; 

namespace socialApi 
{ 
    [ServiceContract] 
    public interface IsocialApi 
    { 
     [OperationContract] 
     [WebGet(
      ResponseFormat = WebMessageFormat.Json, 
      BodyStyle = WebMessageBodyStyle.Bare, 
      UriTemplate = "/api/login?username={username}&password={password}")] 
     JsonpAuthenticationResponse Login(string username, string password); 

    } 
} 

는 응답은

http://localhost/socialApi/socialApi.svc/api/login?callback=callback&username=AAAAA&password=BBBB 

의 Web.config은 다음과 같습니다처럼

요청입니다 단지 정상 JSON :

{"Message":"unauthorized","Status":400,"Token":null} 

그리고 내가 원하는 :

callbackfunction({"Message":"unauthorized","Status":400,"Token":null}) 

내가 그것을 내가 예를 수정하고있는 Web.config를 조정할 때 때문에,의 Web.config 함께 할 수있는 뭔가가 생각 그래서 내보기처럼 예제가 더 이상 작동하지 않습니다. 당신은 내가 문제를 정확히 지적했다.

의 Web.config :

가능한 정보만큼 제공하려면, 여기에 예로부터 작업 솔루션입니다

<?xml version="1.0"?> 
<!-- Copyright (c) Microsoft Corporation. All rights reserved. --> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <authentication mode="None" /> 
    </system.web> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
    <system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <standardEndpoints> 
     <webScriptEndpoint> 
     <standardEndpoint name="" crossDomainScriptAccessEnabled="true"/> 
     </webScriptEndpoint> 
    </standardEndpoints> 
    </system.serviceModel> 
</configuration> 

그리고 클래스 :

//---------------------------------------------------------------- 
// Copyright (c) Microsoft Corporation. All rights reserved. 
//---------------------------------------------------------------- 

using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.ServiceModel.Activation; 
using System.ServiceModel.Web; 

namespace Microsoft.Samples.Jsonp 
{ 
    [DataContract] 
    public class Customer 
    {  
     [DataMember] 
     public string Name; 

     [DataMember] 
     public string Address; 
    } 


    [ServiceContract(Namespace="JsonpAjaxService")] 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class CustomerService 
    { 
     [WebGet(ResponseFormat = WebMessageFormat.Json)] 
     public Customer GetCustomer() 
     { 
      return new Customer() { Name="Bob", Address="1 Example Way"}; 
     } 
    } 
} 

위의 예는 jsonp 객체를 반환합니다. 이 예에서의 호출입니다.

function makeCall() { 
      var proxy = new JsonpAjaxService.CustomerService(); 
      proxy.set_enableJsonp(true); 
      proxy.GetCustomer(onSuccess, onFail, null); 
     } 

proxy.set_enableJsonp (true); 내 전화에서 내가 놓친 게 있을까? 그러나 나는 같은 솔루션에서 서비스를 호출하지 않기 때문에 호출 할 때이를 추가 할 수 없습니다.

그래서 JSONP 요청 대신 일반적인 JSON 응답을 유발하는 원인은 무엇입니까?

답변

4

문제는 출고시 설정에 있습니다. svc 파일의 마르크 업에서는 System.ServiceModel.Activation.WebScriptServiceHostFactory로 팩토리를 변경해야했습니다.