Развертывание ASP .NET Core 2.0 не может подключиться к службе WCF в рабочей среде - PullRequest
0 голосов
/ 03 октября 2019

У меня есть основное приложение .NET, к которому подключена служба WCF, в среде dev все работает нормально, но в среде развертывания служба не подключается. Я опубликовал основной проект ASP .NET и разместил его в IIS, опубликованное приложение также содержит файл ConnectedService.json:

{
  "ProviderId": "Microsoft.VisualStudio.ConnectedService.Wcf",
  "Version": "15.0.20628.921",
  "GettingStartedDocument": {
    "Uri": "https://go.microsoft.com/fwlink/?linkid=858517"
  },
  "ExtendedData": {
    "Uri": "http://localhost:8759/Design_Time_Addresses/CECWcfServiceLib/CECService/text/mex",
    "Namespace": "CEC_WCF_Service",
    "SelectedAccessLevelForGeneratedClass": "Public",
    "GenerateMessageContract": false,
    "ReuseTypesinReferencedAssemblies": true,
    "ReuseTypesinAllReferencedAssemblies": true,
    "CollectionTypeReference": {
      "Item1": "System.Array",
      "Item2": "System.Runtime.dll"
    },
    "DictionaryCollectionTypeReference": {
      "Item1": "System.Collections.Generic.Dictionary`2",
      "Item2": "System.Collections.dll"
    },
    "CheckedReferencedAssemblies": [],
    "InstanceId": null,
    "Name": "CEC_WCF_Service",
    "Metadata": {}
  }
}

Я получаю ошибку

System.NullReferenceException: Object reference not set to an instance of an object.
   at AspNetCore.Views_Home_CEC_Dashboard.ExecuteAsync() in D:\Users\sajja\source\repos\CECDashboard\CECDashboard\Views\Home\CEC_Dashboard.cshtml:line 9
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context)
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, Boolean invokeViewStarts)
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, String contentType, Nullable`1 statusCode)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ActionContext actionContext, IView view, ViewDataDictionary viewData, ITempDataDictionary tempData, String contentType, Nullable`1 statusCode)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ExecuteAsync(ActionContext context, ViewResult result)
   at Microsoft.AspNetCore.Mvc.ViewResult.ExecuteResultAsync(ActionContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultAsync(IActionResult result)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResultFilterAsync[TFilter,TFilterAsync]()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultFilters()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

Яотсутствует конфигурация развертывания, потому что она отлично работает в среде разработки.

[ Обновление ] Код в HomeController

public ActionResult CEC_Dashboard()
        {
            try
            {
                CEC_WCF_Service.CECServiceClient cECService = new CEC_WCF_Service.CECServiceClient();
                var task1 = Task.Run(async () => await cECService.OpenAsync());
                task1.Wait();

                var task2 = Task.Run(async () => await cECService.GetAccountsAsync());
                task2.Wait();
                var accountsInfo = task2.Result.ToList();

                var task3 = Task.Run(async () => await cECService.GetAccountStatsOnAccountAsync(1));
                task3.Wait();
                var account_Stats = task3.Result.ToList();

                ViewData["Account_Stats"] = account_Stats;
                ViewData["accountsInfo"] = accountsInfo;
                ViewData["DefaultAccountsView"] = accountsInfo.Find(o => o.AccountId == 1);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            return View();
        }

1 Ответ

0 голосов
/ 07 октября 2019

Итак, после нескольких дней исследований я понял проблему. Как первоначально предполагалось, проблема действительно была связана с конфигурацией WCF для производственного развертывания.

Итак, вот что я сделал после исследования нескольких потоков.

1 - Внедрение IConfiguration в HomeController

public class HomeController : Controller
    {
        private IConfiguration configuration;

        public HomeController(IConfiguration iConfig)
        {
            configuration = iConfig;
        }
  <...More Class Code here ...>
 }

2 - Добавлены настройки в appsettings.json

"MyService": {
    "EndpointUrl": "http://localhost:8082/hello?wsdl"
  }

3 - Вот чего не хватало при производственном развертывании. Файл Reference.cs имеет адрес адреса времени разработки, поэтому я выполнил все вышеперечисленное, чтобы смягчить и загрузить рабочий адрес во время выполнения.

Этот метод упоминается в одном из постов Справочный пост

//
                var EndPoint = configuration.GetSection("MyService").GetSection("EndpointUrl").Value;
                System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding();
                result.MaxBufferSize = int.MaxValue;
                result.ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max;
                result.MaxReceivedMessageSize = int.MaxValue;
                result.AllowCookies = true;
                //

                CEC_WCF_Service.CECServiceClient cECService = new CEC_WCF_Service.CECServiceClient(result, new System.ServiceModel.EndpointAddress(EndPoint));
                var task1 = Task.Run(async () => await cECService.OpenAsync());
                task1.Wait();

Это решило проблему с производственным развертыванием!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...