2016-09-27 10 views
3

У меня есть служба WCF, которая мне нужна для доступа из ASP.NET Core. Я установил WCF Connected Preview и создал прокси успешно.Как добавить клиента службы WCF в ядро ​​ASP.Net?

Он создал интерфейс & клиента что-то вроде ниже

[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "0.3.0.0")] 
    [System.ServiceModel.ServiceContractAttribute(ConfigurationName="ServiceReference1.IDocumentIntegration")] 
    public interface IDocumentIntegration 
    { 

     [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IDocumentIntegration/SubmitDocument", ReplyAction="http://tempuri.org/IDocumentIntegration/SubmitDocumentResponse")] 
     [System.ServiceModel.FaultContractAttribute(typeof(ServiceReference1.FaultDetail), Action="http://tempuri.org/IDocumentIntegration/SubmitDocumentFaultDetailFault", Name="FaultDetail", Namespace="http://schemas.datacontract.org/2004/07/MyCompany.Framework.Wcf")] 
     System.Threading.Tasks.Task<string> SubmitDocumentAsync(string documentXml); 
    } 

    [System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "0.3.0.0")] 
    public interface IDocumentIntegrationChannel : ServiceReference1.IDocumentIntegration, System.ServiceModel.IClientChannel 
    { 
    } 

    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "0.3.0.0")] 
    public partial class DocumentIntegrationClient : System.ServiceModel.ClientBase<ServiceReference1.IDocumentIntegration>, ServiceReference1.IDocumentIntegration 
    { 
     // constructors and methods here 
    } 

потребительского класса, который вызывает служба выглядит, как показано ниже

public class Consumer 
{ 
    private IDocumentIntegration _client; 
    public Consumer(IDocumentIntegration client) 
    { 
    _client = client; 
    } 

    public async Task Process(string id) 
    { 
    await _client.SubmitDocumentAsync(id); 
    } 
} 

Как зарегистрировать IDocumentIntegration с методом ConfigureServices в классе запуска? Я хочу, чтобы настройки RemoteAddress & ClientCredentials при регистрации

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddApplicationInsightsTelemetry(Configuration); 
     services.AddMvc(); 

     // how do I inject DocumentIntegrationClient here?? 
     var client = new DocumentIntegrationClient();    
     client.ClientCredentials.UserName.UserName = "myusername"; 
     client.ClientCredentials.UserName.Password = "password"; 
     client.Endpoint.Address = new EndpointAddress(urlbasedonenvironment) 

    } 
+0

Вы пытались использовать метод фабрики, который является перегрузкой для методов AddXxx? – Tseng

+0

Вот что я подумал. Я пытался использовать AddScoped .. но я хотел бы знать синтаксис? – LP13

ответ

7

Использование перегрузки метода фабрики кажется подходящим примером использования этого.

services.AddScoped<IDocumentIntegration>(provider => { 
    var client = new DocumentIntegrationClient(); 

    // Use configuration object to read it from appconfig.json 
    client.ClientCredentials.UserName.UserName = Configuration["MyService:Username"]; 
    client.ClientCredentials.UserName.Password = Configuration["MyService:Password"]; 
    client.Endpoint.Address = new EndpointAddress(Configuration["MyService:BaseUrl"]); 

    return client; 
}); 

Где ваши AppSettings будет выглядеть

{ 
    ... 
    "MyService" : 
    { 
     "Username": "guest", 
     "Password": "guest", 
     "BaseUrl": "http://www.example.com/" 
    } 
} 

В качестве альтернативы, впрыснуть Options с помощью опций шаблона. Поскольку DocumentIntegrationClient является частичным, вы можете создать новый файл и добавить параметризованный конструктор.

public partial class DocumentIntegrationClient : 
    System.ServiceModel.ClientBase<ServiceReference1.IDocumentIntegration>, ServiceReference1.IDocumentIntegration 
{ 
    public DocumentIntegrationClient(IOptions<DocumentServiceOptions> options) : base() 
    { 
     if(options==null) 
     { 
      throw new ArgumentNullException(nameof(options)); 
     } 

     this.ClientCredentials.Username.Username = options.Username; 
     this.ClientCredentials.Username.Password = options.Password; 
     this.Endpoint.Address = new EndpointAddress(options.BaseUrl); 
    } 
} 

И создать класс вариантов

public class DocumentServiceOptions 
{ 
    public string Username { get; set; } 
    public string Password { get; set; } 
    public string BaseUrl { get; set; } 
} 

и заполнить его от appsettings.json.

services.Configure<DocumentServiceOptions>(Configuration.GetSection("MyService")); 
+0

Спасибо, это именно то, что я искал. Я получал ошибку в моем анонимном синтаксисе функции – LP13