c# - 从 C# 控制台应用程序迁移和运行 REST API 到 ASP.NET

标签 c# asp.net asp.net-web-api visual-studio-2015 migration

要求:
需要在托管服务器上部署 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);
            }
        }

    }
}

实际结果:

在通过 PostMan 客户端软件发出/发送 POST 请求时,除了显示在调试输出窗口中的错误之外,还显示了计算值

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)

刷新页面后,以下代码抛出异常

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 的情况下,以下异常会在“事件”选项卡的“诊断工具”窗口中堆叠

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 它显示为

Could not get any response There was an error connecting to http://somedomain.xy:8081/Calculator/sum.

预期结果:
通过 PostMan 调用计算值应该需要显示
因为我需要在托管服务器上启动并运行该服务。由于我既无法找出根本原因,也无法找出整个问题的解决方案,无论是从编码部分弹出还是端口问题?

最佳答案

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 服务。这就是为什么它在您第一次加载页面时有效,但在刷新页面后失败(因为您已经重新配置并重新启动了该服务的另一个实例)。

虽然您的代码可以在控制台应用程序中运行,但这不是您在 IIS 中托管 WCF 服务的方式。 Microsoft Docs 站点上有该设置的详细演练:

Deploying an Internet Information Services-Hosted WCF Service

虽然完整教程不太适合作为 Stack Overflow 的答案,但我将引用一般步骤:

  • Ensure that IIS, ASP.NET, WCF, and the WCF activation component are correctly installed and registered.

  • Create a new IIS application, or reuse an existing ASP.NET application.

  • Create a .svc file for the WCF service.

  • Deploy the service implementation to the IIS application.

  • Configure the WCF service.

关于c# - 从 C# 控制台应用程序迁移和运行 REST API 到 ASP.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55297798/

相关文章:

c# - ListView ColumnHeader.Name 为空字符串

c# - 用于动态 View 数据/表单的 ASP.Net MVC 编辑器模板

asp.net 确保 javascript 只加载一次

asp.net - 如何使用 ASP.NET MVC Web API OData 链接到 Razor 中的 OData 集合

asp.net-web-api - WebApi 中 Controller 名称的连字符 url

c# - Serilog - ForContext 将字典值视为复杂对象

c# - 如何从递增的整数生成重复序列

c# - 仅在 WCF Web 服务中需要某些方法的凭据

c# - 正则表达式 : trying to include unlimited whitespaces for any words in ASP. NET C#

c# - ASP Core WebApi 文件上传允许所有内容类型