Как я могу вызвать службу WCF, размещенную в приложении службы windows, из веб-приложения?
Я хотел вызвать метод в приложении службы windows из веб-приложения. Для этого я разместил службу WCF в приложении службы Windows. Тем не менее, я понятия не имею, как вызвать метод в службе WCF, размещенной в приложении службы windows, из веб-приложения.
могу ли я узнать, можно ли общаться из веб-приложения со службой WCF, размещенной в приложении службы windows, так, как вы называете веб-api? (Я пытаюсь вызвать службу WCF с помощью Angularjs)
Если да, то может ли кто-нибудь помочь мне с примером.
Я студент, и простите меня, если я неправильно излагаю факты.
Что я уже пробовал:
Мой сервисный код WCF
Служба HelloService.в CS
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace HelloService { // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "HelloService" in both code and config file together. public class HelloService : IHelloService { public string GetMessage() { return "Hello "; } } }
IHelloService.в CS
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using System.ServiceModel.Web; namespace HelloService { // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IHelloService" in both code and config file together. [ServiceContract] public interface IHelloService { [OperationContract] [WebInvoke(Method = "GET", UriTemplate = "GetMessage", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)] string GetMessage(); } }
Мой код приложения службы Windows
HelloWindowsService.в CS
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; using System.ServiceModel; namespace WindowsServiceHost { public partial class HelloWindowsService : ServiceBase { ServiceHost host; public HelloWindowsService() { InitializeComponent(); } protected override void OnStart(string[] args) { host = new ServiceHost(typeof(HelloService.HelloService)); host.Open(); } protected override void OnStop() { host.Close(); } } }
Приложение.конфиг
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="mexBehavior0"> <serviceMetadata httpGetEnabled="true" /> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="mexBehavior0" name="HelloService.HelloService"> <clear /> <endpoint address="HelloService" binding="basicHttpBinding" contract="HelloService.IHelloService"> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"> </endpoint> <host> <baseAddresses> <add baseAddress="http://localhost:8080" /> </baseAddresses> </host> </service> </services> </system.serviceModel> </configuration>
код веб-приложения
HelloService.js
app.service('HelloService', ['$http', '$q', function ($http, $q) { var msg = " "; this.hello = function () { var error; var deferred = $q.defer(); $http({ type: "GET", url: "http://localhost:8080/HelloService/GetMessage", }).then(function successCallback(result) { msg = result.data; deferred.resolve(); }, function errorCallback(err) { error = err; deferred.reject(); }); return deferred.promise; }; this.getMsg = function () { return msg; }; }]);
HelloControl.js
app.controller('HelloControl', ['$scope', 'HelloService', function ($scope, HelloService) { $scope.msg = " "; $scope.hello = function () { HelloService.hello().then(function (result) { $scope.msg = HelloService.getMsg(); }); }; }]);
App.js
var app = angular.module('HelloApp', []);
Afzaal Ahmad Zeeshan
Может ли ваше веб-приложение получить доступ к адресу, где размещен ваш WCF? Это работает в большинстве локальных случаев, но для интернет-приложений вам нужно обеспечить много вещей.
Member 12963196
@Afzaal, Спасибо за комментарий. Я новичок в этих вещах и работаю над тем, чтобы найти способ связи между браузером и приложением-службой windows. Затем я нашел о службе wcf, которая может быть размещена в приложении службы windows. вы думаете, это невозможно? :(
Afzaal Ahmad Zeeshan
Нет, это не так, но для этого вам нужно убедиться, что конечные точки (URL-адрес), где вы получаете доступ к сервису, на самом деле являются реальной конечной точкой, где размещается WCF.
Member 12963196
@Afzaal я могу попробовать url конечной точки, просто набрав его в браузере. Но не удалось вызвать его через веб-приложение :(
Member 12963196
@Afzaal thannk тебе за помощь. Наконец, возможность передачи строковых данных из веб-приложения в приложение-службу Windows :)
Jon McKee
Здесь есть несколько хороших предложений, но я должен спросить: требовать WCF? WCF очень полезен, когда вам нужна служба для обработки TCP, каналов и т. д. Если вам требуется только HTTP, подумайте об использовании службы REST, такой как ASP.NET проект веб-API. Гораздо проще настроить и использовать по сравнению с WCF.
Member 12963196
@Jon через службу REST могу ли я вызвать метод в приложении службы windows из веб-приложения?
Jon McKee
Этот это хорошая статья. Если вы уже знакомы с WCF, я бы просто пошел по этому пути, если только вы не знаете Web API. Web API (и REST в целом) требует меньше конфигурации, чем WCF (и SOAP), поэтому работать с imo проще.
Member 12963196
@jon большое вам спасибо. Я студент, я тоже попробую это сделать. :)
Member 12963196
@Jon это сработало, и я путаюсь во всем, включая WCF, в то время как это можно легко сделать с помощью web API.:)спасибо.
Member 12963196
@Jon thannk тебе за помощь. Наконец, возможность передачи строковых данных из веб-приложения в приложение-службу Windows :)