Member 12963196 Ответов: 2

Как я могу вызвать службу 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 :)

2 Ответов

Рейтинг:
5

Member 12963196

Всем привет!!!
Прежде всего, большое вам спасибо за то, что помогли мне достичь моей цели. Моя цель состояла в том, чтобы вызвать метод в приложении службы windows из веб-приложения.
Чтобы добиться этого, я попробовал использовать сервис WCF.
проблема, с которой я столкнулся, была

no-access-control-allow-origin-header-is-present-on-the-requested-resource-err
.
поэтому я не смог найти лучшего решения для этого.
но с помощью @Jon McKee с Веб-API Self-Hosting с использованием службы Windows: Часть 1[этот] статья, в которой я смог достичь своей цели без
служба WCF.
вот и я попал
no-access-control-allow-origin-header-is-present-on-the-requested-resource-err
.
я исправил это с помощью
System.Web.Http.Cors
.
Спасибо вам всем!


Jon McKee

Ах, Коров Вот почему был создан JSONP =)

Member 12963196

@Jon я не знаком с JSONP.: (не могу ли я использовать JSONP с angularjs?

Jon McKee

JSONP-это в основном просто JSON, который завернут в вызов функции и встроен в виде скрипта для обхода CORS. Вы можете использовать JSONP, если служба поддерживает возврат данных в виде JSONP вместо обычного JSON. Можно найти отличное суммирование здесь. Или здесь если вам нужно более техническое объяснение.

Member 12963196

@Jon большое вам спасибо. Я тоже попробую эту штуку. :)

Jon McKee

Я добавил к своему ответу, если вы хотите более техническое и менее "вот как вы его используете" объяснение=) Я рад, что вы так интересуетесь различными технологиями! Миру нужно больше этого =D

Member 12963196

@Jon я считаю, что легче найти лучшее решение, когда вы подвергаетесь воздействию всех видов технологий. В конце концов, я студент, которому есть что исследовать с помощью вас, ребята. :)

Рейтинг:
0

Suvabrata Roy

Привет,

Потребляйте WCF из javascript : Dotnet на примере: вызов службы WCF из Javascript[^]


Member 12963196

@Suvabrata, Спасибо за вашу помощь. Но то, что я хочу, - это вызвать службу wcf, которая размещается в приложении службы WINDOWS из веб-приложения. :(

Suvabrata Roy

Здравствуйте, для автономного сервиса вы должны включить JSONP для клиентов AJAX, чтобы использовать его. Чтобы включить, лежит предположение, установите свойство CrossDomainScriptAccessEnabled на привязку webhttpbinding значение true. Что касается того, как потреблять услугу,

Ссылка : https://social.msdn.microsoft.com/Forums/vstudio/en-US/2c3dc15a-b019-480c-82a5-b85765dcd761/consuming-a-selfhosted-wcf-web-service-with-custom-arguments-in-javascript?forum=wcf

Member 12963196

@Suvabrata, большое вам спасибо. Я изменяю конфигурацию своего приложения с помощью свойства CrossDomainScriptAccessEnabled на true. но все еще возникают некоторые проблемы с вызовом его из веб-приложения. :(

Suvabrata Roy

Пожалуйста, опубликуйте фактическую ошибку, с которой вы столкнулись...

Member 12963196

& lt;?xml version=" 1.0 "encoding=" utf-8"? >
& lt;конфигурация>
& lt;system. servicemodel>
& lt;поведение>
<endpointbehaviors>
< имя поведения= "webBehavior">
<webHttp helpEnabled= "true" defaultBodyStyle= "Wrapped" defaultOutgoingResponseFormat= " Json"
automaticFormatSelectionEnabled= "false" />


& lt;servicebehaviors>
< имя поведения= "mexBehavior">
<serviceMetadata httpGetEnabled= "true" />



& lt;привязки>
< webHttpBinding >
<binding name=" webBindingConfiguration "crossDomainScriptAccessEnabled= "true" />


<serviceHostingEnvironment multipleSiteBindingsEnabled= " true"
aspNetCompatibilityEnabled= "true" />
< Услуги>
< service behaviorConfiguration=" mexBehavior "name=" HelloServiceLibrary.HelloService " >
<endpoint address= "" behaviorConfiguration=" webBehavior "binding=" webHttpBinding"
bindingconfiguration="webBindingConfiguration" contract= " HelloServiceLibrary.IHelloService " />
& lt;хост>
& lt;базовые адреса>
&ЛТ;добавить базовый адрес="http://localhost:8070/" /&ГТ;





Suvabrata Roy

это привязка, которую я попросил об ошибке ???

Member 12963196

Извиняюсь,
На запрашиваемом ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Происхождение 'http://localhost:55174-следовательно, доступ запрещен.

Member 12963196

Я работал с restful WCF, чтобы быть размещенным в сервисном приложении и иметь возможность получить результат, указав базовый адрес с параметром. Но когда я вызываю через свое веб-приложение тот же базовый адрес таким же образом, он показывает ошибку

На запрашиваемом ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Происхождение 'http://localhost:55174-следовательно, доступ запрещен.

:(

Suvabrata Roy

Попробуйте это :http://stackoverflow.com/questions/28547288/no-access-control-allow-origin-header-is-present-on-the-requested-resource-err?answertab=active#tab-top

Member 12963196

@Suvabrata спасибо. Мне удается избавиться от ошибки с помощью расширения chrome.

Member 12963196

@Suvabrata большое вам спасибо за помощь. Наконец, возможность передачи строковых данных из веб-приложения в приложение-службу Windows :)