Миграция и запуск REST API из консольного приложения C # в ASP.NET - PullRequest
3 голосов
/ 22 марта 2019

Требования: Необходимо развернуть REST API на хостинг-сервере.Поэтому перенес код из Консольного приложения C # в ASP.NET, который успешно работал на локальном хосте с некоторыми ошибками

Вот код ниже

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Net;
using System.Diagnostics;

namespace WebAPI
{
    [ServiceContract]
    public interface ICalculator
    {
        [OperationContract, WebInvoke(UriTemplate = "/sum", Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        double sum(double x, double y);
    }

    public class Calculator : ICalculator
    {
        public double sum(double x, double y)
        {
            return x + y;
        }
    }
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Debug.WriteLine("Initializing URL");
            string baseAddress = "http://localhost:8081/Calculator";
            WebServiceHost myHost = new WebServiceHost(typeof(Calculator), new Uri(baseAddress));

            try
            {
                System.Diagnostics.Debug.WriteLine("Starting Service ...");
                myHost.Open();
            }
            catch (Exception ex)
            {

                //Response.Write(ex);
                //System.Diagnostics.Debug.WriteLine("Exception");
                //myHost.Close();
                //throw new FaultException(ex.Message);
            }
        }

    }
}

Фактический результат:

При создании / отправке запроса POST через клиентское программное обеспечение PostMan в дополнение к той ошибке, которая отображалась в окне «Вывод» в «Отладке», отображалось

* 1016.*

После обновления страницы возникла исключительная ситуация с помощью следующих кодов

myHost.Close();

CommunicationObjectFaultedException was unhandled by user code
An exception of type 'System.ServiceModel.CommunicationObjectFaultedException' occurred in System.ServiceModel.dll but was not handled in user code
Additional information: The communication object, System.ServiceModel.Web.WebServiceHost, cannot be used for communication because it is in the Faulted state.


Exception thrown: 'System.InvalidOperationException' in System.ServiceModel.dll
Exception thrown: 'System.ServiceModel.CommunicationObjectFaultedException' in System.ServiceModel.dll
'iisexpress.exe' (CLR v4.0.30319: /LM/W3SVC/2/ROOT-1-131977214492956233): Loaded 'C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\14.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.

throw new FaultException(ex.Message);

CommunicationObjectFaultedException was unhandled by user code
An exception of type 'System.ServiceModel.CommunicationObjectFaultedException' occurred in System.ServiceModel.dll but was not handled in user code
Additional information: The communication object, System.ServiceModel.Web.WebServiceHost, cannot be used for communication because it is in the Faulted state.


Exception thrown: 'System.InvalidOperationException' in System.ServiceModel.dll
Exception
Exception thrown: 'System.ServiceModel.CommunicationObjectFaultedException' in System.ServiceModel.dll
'iisexpress.exe' (CLR v4.0.30319: /LM/W3SVC/2/ROOT-1-131977154884215275): Loaded 'C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\14.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.

Без Catch Block, нижеуказанное исключение складывалось в окне инструментов диагностики на вкладке Events

Exception: Exception thrown: 'System.InvalidOperationException' in System.ServiceModel.dll ("The ChannelDispatcher at 'http://localhost:8081/Calculator' with contract(s) '"ICalculator"' is unable to open its IChannelListener."). Exception thrown: 'System.InvalidOperationException' in System.ServiceModel.dll ("The ChannelDispatcher at 'http://localhost:8081/Calculator' with contract(s) '"ICalculator"' is unable to open its IChannelListener.")

Как мне нужно перехватить эти исключения

Изменение string baseAddress = "http://somedomain.xy:8081/Calculator"; и загрузка его на сервер в PostMan, который он отображал как

Не удалось получить ответ. Ошибка подключения к http://somedomain.xy:8081/Calculator/sum.

Ожидаемый результат: При совершении звонков через PostMan вычисленные значения должны отображатьсяТак как мне нужно было настроить сервис и запустить его на хостинг-сервере.Поскольку я не могу выяснить ни основную причину, ни решения для всей проблемы, высовывается ли это из части кодирования или проблемы с портом?

Ответы [ 2 ]

1 голос
/ 22 марта 2019
The thread 0x3104 has exited with code 0 (0x0).
Application Insights Telemetry (unconfigured): {"name":"Microsoft.ApplicationInsights.Dev.Request","time":"2019-03-22T07:52:36.2582149Z","tags":{"ai.internal.sdkVersion":"web: 2.0.0.25000","ai.device.roleInstance":"DESKTOP-5DRIFMH","ai.operation.name":"GET /default.aspx","ai.operation.id":"mHfOluFrMKQ="},"data":{"baseType":"RequestData","baseData":{"ver":2,"id":"mHfOluFrMKQ=","name":"GET /default.aspx","startTime":"2019-03-22T13:22:36.2582149+05:30","duration":"00:00:04.1154559","success":true,"responseCode":"200","url":"http://localhost:29989/default.aspx","httpMethod":"GET","properties":{"DeveloperMode":"true"}}}}
'iisexpress.exe' (CLR v4.0.30319: /LM/W3SVC/2/ROOT-1-131977147547841156): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_32\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
The thread 0x332c has exited with code 0 (0x0)

Все эти строки в окне «Вывод» полностью нормальны и могут игнорироваться (потоки, выходящие с кодом ошибки 0, когда они больше не используются, ведение журнала телеметрии, сборки, загружаемые в процесс IIS).

Конкретная ошибка, которую вы получаете впоследствии, связана с тем, что вы пытаетесь разместить службу WCF несколько раз.Вот почему он работает при первой загрузке страницы, но не работает после обновления страницы (потому что вы перенастроили и повторно запустили другой экземпляр службы).

Пока ваш код будет работать в консолиприложение, это не то, как вы размещаете службу WCF в IIS.Подробное описание этой настройки приведено здесь, на сайте Microsoft Docs:

Развертывание службы WCF, размещенной в информационных службах Интернета

Хотя полное руководство не совсем подходит дляОтвет переполнения стека, я процитирую общие шаги:

  • Убедитесь, что IIS, ASP.NET, WCF и компонент активации WCF правильно установлены и зарегистрированы.

  • Создание нового приложения IIS или повторное использование существующего приложения ASP.NET.

  • Создание файла .svc для службы WCF.

  • Развертывание реализации службы в приложении IIS.

  • Настройка службы WCF.

0 голосов
/ 25 марта 2019

Как сказали Crowcoder и Josh Darnell, нам нужно к тому времени создать службу WCF и разместить ее в любом домене, не вызывая проблем с портом

Здесь, в моем репозитории Git, вы можете найти весь код калькулятораприлагается к публикации также на сервере. GitHub Repo

Вы можете отключить службу телеметрии в командной строке с помощью

set DOTNET_CLI_TELEMETRY_OPTOUT=1 
...