从C#控制台应用程序迁移和运行REST API到ASP.NET
需求:
需要在Hosting Server上部署REST API.因此,将代码从C#控制台应用程序迁移到ASP.NET,该代码在localhost上成功运行,但有一些错误 这是下面的代码 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请求时,除了在Debug的输出窗口中显示的错误之外,还显示了计算值. 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:WindowsMicrosoft.NetassemblyGAC_32System.Transactionsv4.0_4.0.0.0__b77a5c561934e089System.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) 刷新页面后,以下代码引发了异常
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:WindowsassemblyGAC_MSILMicrosoft.VisualStudio.Debugger.Runtime14.0.0.0__b03f5f7f11d50a3aMicrosoft.VisualStudio.Debugger.Runtime.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
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,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:WindowsassemblyGAC_MSILMicrosoft.VisualStudio.Debugger.Runtime14.0.0.0__b03f5f7f11d50a3aMicrosoft.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.") 我怎么需要捕获这些异常 更改字符串baseAddress =“http://somedomain.xy:8081 / Calculator”;
预期结果: 解决方法The thread 0x3104 has exited with code 0 (0x0). Application Insights Telemetry (unconfigured): {"name":"Microsoft.ApplicationInsights.Dev.Request","properties":{"DeveloperMode":"true"}}}} 'iisexpress.exe' (CLR v4.0.30319: /LM/W3SVC/2/ROOT-1-131977147547841156): Loaded 'C:WindowsMicrosoft.NetassemblyGAC_32System.Transactionsv4.0_4.0.0.0__b77a5c561934e089System.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答案,但我将引用一般步骤:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |