2013-08-22 2 views
1

asp.net을 사용하고 있습니다. C#에서 WCF 서비스를 만들고 IIS 서버에서 호스팅했습니다. 내 asp.net 웹 응용 프로그램에서 JQuery를 사용하여이 서비스를 호출합니다. JQuery를 사용하여 서비스를 호출하면 오류 함수가 발생하고 경고 메시지가 나타납니다.JQuery를 사용하여 WCF 서비스를 호출하는 동안 WCF 서비스 호출이 실패합니다.

서비스 양식 .aspx 페이지 호출.

<script src="Script/jquery-1.10.2.min.js" type="text/javascript"></script> 

<script type="text/javascript" language="javascript"> 
function callService() 
{ 
    var value = 10; 
    $.ajax({ 
     type: "POST", 
     url: "http://localhost/IISWCF/Service1.svc/getdata", 
     contentType: "application/json; charset=utf-8", 
     data: '{"value": "' + value + '"}', 
     dataType: "json", 
     processdata: true, //True or False 
     error: function(XMLHttpRequest, textStatus, errorThrown) { 
      alert("error: " + errorThrown); 
     }, 
     success: function(msg) { 
      alert(msg.d); 
     } 
    }); 
} 
</script> 

<script type="text/javascript" language="javascript"> 
$(document).ready(function(){ 
    callService(); 
}) 
</script> 

Service1.svc는

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Service1 : IService1 
{ 
    public string GetData(int value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 
} 

IService1.cs이

namespace WcfService1 
{ 
    [ServiceContract] 
    public interface IService1 
    { 

     [OperationContract] 
     [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json)] 
     string GetData(int value); 
    } 
} 

WCF의 Web.config가

<system.serviceModel> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name="WcfService1.Service1Behavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
     <behavior name="EndpBehavior"> 
     <webHttp/> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
    <services> 
    <service name="WcfService1.Service1" behaviorConfiguration="WcfService1.Service1Behavior"> 
     <endpoint behaviorConfiguration="EndpBehavior" address="" binding="webHttpBinding" contract="WcfService1.IService1"> 
     <identity> 
      <dns value="localhost"/> 
     </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    </service> 
    </services> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel> 

가 해결이 문제 제발 도와주세요 파일 파일을 파일.

+0

시도는이 문서에 언급 된 지침을 사용합니다. WebGet과 WebInvoke가 누락 된 것 같습니다. http://www.codeproject.com/Articles/132809/Calling-WCF-Services-using-jQuery –

+0

나는 링크에서 언급 된 단계를 따라 왔고 문제가 해결되지 않았습니다. 나는 새 질문으로 나의 질문을 편집했다. 너 나 좀 도와 줄 수있어? – user2322512

+0

끝점 바인딩을 webHttpBinding으로 변경하십시오. – Erwin

답변

0

더미 코드를 추가했습니다. 아마도 몇 가지 방법도 사용되지 않았을 것입니다. 하지만 더미 DoubleUp 메서드로 코드를 테스트 할 수 있습니다. 또한 endpointbehavior를 정의했으나 사용되었으므로 엔드 포인트와 그 중요도에 적용해야합니다. 아래 예를 참조하십시오.

// NOTE: You can use the "Rename" command on the "Refactor" menu to change the  interface name "IService1" in both code and config file together. 
[ServiceContract] 
public interface ICalculatorService 
{ 

    [OperationContract] 
    [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "/DoubleUp/{val}")] 
    int DoubleUp(string val); 

    [OperationContract] 
    [WebGet(ResponseFormat=WebMessageFormat.Json, UriTemplate="/{value}/{value1}")] 
    int AddValues(string value, string value1); 

    [OperationContract] 
    [WebGet(ResponseFormat = WebMessageFormat.Json)] 
    string ConcatenateString(string stringArray); 
} 


public class CalculationService : ICalculatorService 
{ 

    public int DoubleUp(string val) 
    { 
     return 2 * Convert.ToInt32(val); 
    } 

    public int AddValues(string value, string value1) 
    { 
     return Convert.ToInt32(value) + Convert.ToInt32(value1); 
    } 

    public string ConcatenateString(string stringArray) 
    { 
     string returnString = string.Empty; 
     returnString += stringArray;   

     return returnString; 
    } 
} 

<system.serviceModel> 
<bindings> 
    <webHttpBinding> 
    <binding name="JSONBinding"></binding> 
    </webHttpBinding> 
    <basicHttpBinding> 
    <binding name="basicHTTP"> 
     <security mode="None"> 

     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="basicBehavior"> 
     <!-- To avoid disclosing metadata information, set the values below to false before deployment --> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="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="false"/> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="JSON"> 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<services> 
<service name="RestWCFService.CalculationService" behaviorConfiguration="basicBehavior"> 
    <endpoint address="basic" binding="basicHttpBinding" contract="RestWCFService.ICalculatorService" bindingName ="basicHTTP"></endpoint> 
    <endpoint behaviorConfiguration="JSON" binding="webHttpBinding" bindingConfiguration="JSONBinding" contract="RestWCFService.ICalculatorService" name="JSONService"></endpoint> 
    </service>  
</services> 

<protocolMapping> 
    <add binding="basicHttpBinding" scheme="http"/> 
    <add binding="basicHttpsBinding" scheme="https" /> 
</protocolMapping>  
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 



/* This is the code for accessing the service via REST call 
     WebClient client = new WebClient(); 
     string s = client.DownloadString("http://localhost/RestWCFService/CalculationService.svc/DoubleUp/3"); 
     Console.WriteLine("Response returned is:" + s); 
     */ 

     /*This is the section to access service via Proxy */ 

     ChannelFactory<RestWCFService.ICalculatorService> client = new ChannelFactory<RestWCFService.ICalculatorService>(); 

     client.Endpoint.Address = new EndpointAddress("http://localhost/RestWCFService/CalculationService.svc/basic"); 
     client.Endpoint.Binding = new BasicHttpBinding(); 
     RestWCFService.ICalculatorService service = client.CreateChannel(); 

     int val = service.DoubleUp("2"); 
     ((IClientChannel)service).Close(); 
     client.Close(); 

     Console.WriteLine("Values returned is:" + val.ToString()); 

     /*Programmatic access ends here */ 

     Console.ReadLine(); 

서비스가 정상적으로 작동합니다. 약간의 변경을가했습니다.

[ServiceContract] 
public interface IService1 
{ 

    [OperationContract] 
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate="/GetData?value={value}")] 
    string GetData(int value); 
} 

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Service1 : IService1 
{ 
    public string GetData(int value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 
} 

<system.serviceModel>  
    <behaviors> 
    <serviceBehaviors> 
     <behavior name="WcfService1.Service1Behavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
     <behavior name="EndpBehavior"> 
     <webHttp/> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
    <services> 
    <service name="WcfService1.Service1" behaviorConfiguration="WcfService1.Service1Behavior"> 
     <endpoint behaviorConfiguration="EndpBehavior" address="" binding="webHttpBinding" contract="WcfService1.IService1"> 
     <identity> 
      <dns value="localhost"/> 
     </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    </service> 
    </services> 
<protocolMapping> 
    <add binding="basicHttpsBinding" scheme="https" /> 
</protocolMapping>  
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

브라우저에서 서비스에 액세스하면 결과가 나타납니다.

http://localhost/IISWCF/Service1.svc/GetData?value=1 

서비스가 정상적으로 작동하는 경우 JS가이 서비스 요청에 대해 올바르지 않으므로이 JS를 시도하십시오. 당신이 응답으로 JSON을 필요로 할 수있는 것 같은

<script type="text/javascript" language="javascript"> 
function callService() { 
    var value = 10; 
    $.ajax({ 
     type: "GET", 
     url: "http://localhost/IISWCF/Service1.svc/GetData?value=1", 
     contentType: "application/json; charset=utf-8", 
     data: '{"value": "' + value + '"}', 
     dataType: "text", 
     processdata: false, //True or False 
     statusCode: { 
      404: function() { 
       alert("page not found"); 
      }, 
      200: function() { 
       alert('HTTP HIT WAS Good.'); 
      }, 
     }, 
     error: function (XMLHttpRequest, textStatus, errorThrown) { 
      alert("error: " + errorThrown); 
     }, 
     success: function (msg) { 
      alert(msg); 
     } 
    }); 
} 

+0

메서드를 사용하여 서비스를 실행하면 "http : // localhost : 61157/Service1.svc/getdata"가 포함 된 메시지를 EndpointDispatcher에서 AddressFilter가 일치하지 않아 수신자에서 처리 할 수 ​​없다는 오류가 발생합니다. 발신자와 수신자의 EndpointAddress가 일치하는지 확인하십시오. " 그러나 끝점 webHttpBinding을 wsbHttpBinding으로 변경하면 페이지가 공백으로 표시됩니다. 너 나 좀 도와 줄 수있어? – user2322512

+0

주소가 일치하지 않습니다. UR1에 불일치가 있습니다. 도메인에 있고 http : //COMPUTERNAME.DOMAIN/SERVICE을 받고 있으며 서비스중인 localhost를 지정하고 있습니다. [ServiceBehavior (AddressFilterMode = AddressFilterMode.Any)]를 추가하여이를 제거 할 수 있습니다. 그러나 모든 요청에 ​​대해서는 좋지 않습니다. –

+0

[ServiceBehavior (AddressFilterMode = AddressFilterMode.Any)]를 추가하고 EndpointDispatcher에서 ContractFilter가 일치하지 않아 수신자에서 "Action with Message"를 처리 할 수 ​​없습니다. 계약 불일치 (보낸 사람과받는 사람 간의 동작이 일치하지 않음) 또는 보낸 사람과받는 사람 사이의 바인딩/보안 불일치. 보낸 사람과받는 사람이 동일한 계약 및 동일한 바인딩 (예 : 메시지, 전송, 없음과 같은 보안 요구 사항 포함)을 갖고 있는지 확인하십시오. 도움이 필요해. – user2322512

관련 문제