在net core 2.0中使用外部WCF

问题描述 投票:0回答:2

我已经读过一些关于它的东西,但我有点困惑,所以我想知道我做了什么。

我在netcore 2.0中创建了一个WEBAPI,我必须使用一个外部WCF(框架4.5),我做了一个非常简单的测试,因为我创建了一个WCF,我可以在WEBAPI中添加服务引用并消耗掉它。所以这个例子运行正常

public async Task<WCFMySevrice.CompositeType> IndexTest2(WCFMySevrice.CompositeType value)
        {
            //Creating Client object of Service Reference
            WCFMySevrice.MyServiceClient client = new WCFMySevrice.MyServiceClient();
            //Call the method from WCF Service
            WCFMySevrice.CompositeType result = await client.GetDataUsingDataContractAsync(value);
            return result;
        }

我的问题是,目前我的WCF的网址是“http://localhost:55203/MyService.svc”,但如果我想在生产环境中部署我的应用程序,URL将会改变,有没有办法配置端点?我已经阅读过它,但我知道这是不可能的,我需要创建一个带有“WCF svcutil工具概述”的代理类,但对我来说并不清楚。如果我使用它,我不再需要服务参考吗?

任何建议都会有所帮助。

wcf asp.net-core-2.0
2个回答
0
投票

当您在visual studio中发布wcf服务时,服务元数据地址由两部分组成。 IIS将提供以下表单。

http://10.157.13.69:8001

地址的其余部分由配置组成。 “/数据”

<system.serviceModel>
    <services>
      <service name="WcfService1.Service1" behaviorConfiguration="mybehavior">
        <endpoint address="Data" binding="wsHttpBinding" contract="WcfService1.IService1" bindingConfiguration="http"></endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
      </service>
    </services>
    <bindings>
      <wsHttpBinding>

上面的服务地址是

http://10.157.13.69:8001/service1.svc/Data

然后我们通过Microsoft WCF Web服务引用提供程序生成客户端代理类。 也就是说,我们可以通过配置文件指定服务端点地址。 如果有什么我可以帮忙,请随时告诉我。


0
投票

亚伯拉罕钱谢谢你的帮助。由于网络核心对我来说是新的,我感到困惑,因为在我只改变web.config中的端点之前,我认为我没有完全清楚这个概念,但我做了什么工作

看,我这样做了:

  1. 在appsettings.json中
{
  "WCFMyService": {
    "EndpointUrl": "http://localhost:55203/MyService.svc"
  }
}
  1. 在startUp类中
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MyServiceOptions>(Configuration.GetSection("WCFMyService"));
    services.AddMvc()
            .AddXmlSerializerFormatters()
            .AddXmlDataContractSerializerFormatters();
}
  1. 我的控制器
namespace APITest_CallWCF.Controllers
{
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Options;
    using System.Collections.Generic;
    using System.ServiceModel;
    using System.Threading.Tasks;

    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        private readonly IOptions<MyServiceOptions> myOptions;

        public ValuesController(IOptions<MyServiceOptions> options)
        {
            this.myOptions = options;
        }

        // GET api/values
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // POST api/values
        [HttpPost]
        public void Post([FromBody]WCFMySevrice.CompositeType value)
        {
            if (ModelState.IsValid)
            {
                IndexText3(value);
            }
        }

        public async Task<WCFMySevrice.CompositeType> IndexText3(WCFMySevrice.CompositeType value)
        {

            BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
            EndpointAddress endpointAddress = new EndpointAddress(myOptions.Value.EndpointUrl);
            WCFMySevrice.MyServiceClient wcfClient = new WCFMySevrice.MyServiceClient(basicHttpBinding, endpointAddress);
            //Call the method from WCF Service
            WCFMySevrice.CompositeType result = await wcfClient.GetDataUsingDataContractAsync(value);

            return result;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.