2015-10-22 6 views
0

Я хочу запрограммировать простой пример «Hello world» для связи между сервисом WCF и html-страницей.Связь между WCF (ServiceHost) и HTML (JQuery)

Чтобы запрограммировать сервер WCF, я использую ниже код:

namespace ConsoleHelloWorldServiceClient 
    { 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var adrs = new Uri[1]; 
      adrs[0] = new Uri("http://localhost:6464"); 
      using (ServiceHost host = new ServiceHost(typeof(HelloWorld.HelloWorldService),adrs)) 
      { 
       host.Open(); 
       Console.WriteLine("Server is open"); 
       Console.WriteLine("Press Enter to close server"); 
       Console.ReadLine(); 
      }   
     }  
    } 
}  

Привет мир Интерфейс

namespace HelloWorld 
    { 
    [ServiceContract] 
    public interface IHelloWorldService 
    { 
     [OperationContract] 
     string SayHello(); 
    } 
    } 

Привет мирового класса

namespace HelloWorld 
{ 
    [DataContract] 
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
    public class HelloWorldService : IHelloWorldService 
     { 
     [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "SayHello")] 
     public string SayHello() 
     { 
      return "Hello World!"; 
     } 
     } 
    } 

Теперь в моей HTML странице я хотел бы щелкнуть по кнопке и отобразить текст.

Затем я использую JQuery для связи со службой:

<!DOCTYPE HTML> 
 
     <html> 
 
      <head> 
 
     <script type="text/javascript" 
 
      src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.10.1.min.js"> 
 
     </script> 
 
    
 
     <script type="text/javascript"> 
 
      var url = 'http://localhost:6464/HelloWorldService'; 
 
      $(document).ready(function() { 
 
       $("#get").click(function() { 
 
        var urlGet = url + 'SayHello'; 
 
        $.getJSON(urlGet, function (data) { 
 
         $('#text').val(data); 
 
        }); 
 
       }); 
 
      }); 
 
    
 
      
 
     </script> 
 
     </head> 
 
     <body> 
 
     <input id="text" type="text" value="Hello" /> 
 
     <input id="get" type="button" value="Get" /> 
 
     </body> 
 
    </html>

Но я такое ощущение, что этот клиент используется только для веб-серверов ... Как я могу это сделать?

Благодарим за помощь.

ответ

1

Вам не хватает пары вещей на вашем хостинге. Не определены привязки. Чтобы быть конкретным для соединения с JQuery, клиентская служба должна быть доступна через протокол Http, а сообщения должны быть в простом или понятном формате, то есть JSON.

var adrs = new Uri("http://localhost:6464"); 
using (ServiceHost host = new ServiceHost(typeof(HelloWorld.HelloWorldService),adrs)) 
{ 
    var restEndPoint = host.AddServiceEndpoint(typeof(IHelloWorldService), new WebHttpBinding(), ""); 
    restEndPoint.Behaviors.Add(new WebHttpBehavior(); 

    host.Open(); 
    Console.WriteLine("Server is open"); 
    Console.WriteLine("Press Enter to close server"); 
    Console.ReadLine(); 
} 

Исправления в ваших объявлениях ServiceContract. Атрибут WebInvoke должен быть заключен в контракте Interface.

[ServiceContract] 
    public interface IHelloWorldService 
    { 
     [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "SayHello")] 
     string SayHello(); 
    } 

Ваша служба идет как:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class HelloWorldService : IHelloWorldService 
    { 
     public string SayHello() 
     { 
      return "Hello World!"; 
     } 
     } 
    } 

DataContract следует использовать только в сообщениях т.е. лиц, не на службе.

+0

Большое спасибо за ваши комментарии. Я исправлю свой код и вернусь к вам. :) – lla

+1

Одна нота - для конечной точки WCF для «разговора JSON» вам также нужно добавить к ней «WebHttpBehavior»: host.AddServiceEndpoint (typeof (IHelloWorldService), новый WebHttpBinding(), «») .Behaviors.Add (новый WebHttpBehavior()); ' – carlosfigueira

+0

@ carlosfigueira Хороший улов! Я полностью пропустил это. Я обновлю ответ. – vendettamit