我正在尝试与WCF一起创建Windows服务。我们不想使用IIS来处理服务的代理。我已经注册并启动了服务。我创建了一个简单的控制台应用程序来调用服务,但它超时了。
我有一个.NET DLL,其中包含调用本地运行的应用程序来创建警报记录的函数。我创建了一个使用AlarmLib.dll的表单应用程序,它可以进行调用并插入警报记录。
这似乎是一个权限问题。我得到以下异常:
> Unhandled Exception: System.ServiceModel.EndpointNotFoundException:
> Could not co nnect to http://localhost:8000/ServiceModel/service. TCP
> error code 10061: No co nnection could be made because the target
> machine actively refused it 127.0.0.1:
> 8000. ---> System.Net.WebException: Unable to connect to the remote
> server ---> System.Net.Sockets.SocketException: No connection could
> be made because the tar get machine actively refused it
> 127.0.0.1:8000
> at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot,
> SocketAddre ss socketAddress) at
> System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP) at
> System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure,
> Sock et s4, Socket s6, Socket& socket, IPAddress& address,
> ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout,
> Exception& exception) --- End of inner exception stack trace
> at System.Net.HttpWebRequest.GetRequestStream(TransportContext&
> context) at System.Net.HttpWebRequest.GetRequestStream() at
> System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStre
> am() --- End of inner exception stack trace ---
我以管理员身份运行VS2010。我可以修改的服务的其他任何设置?
谢谢, 约翰
Windows服务代码:
using System.ServiceProcess;
using System.Text;
using System.ServiceModel;
using System.Configuration;
using System.Configuration.Install;
using AlarmLib;
namespace Test.ServiceModel
.WindowsServices {
//
Define a service contract.
[ServiceContract(Namespace = "http://ServiceModel.WindowsServices")]
public interface IAlarmLib {
[OperationContract]
bool CreateNoDataAlarm(string well, string run, string record, string description, string selectedVariable);
}
// Implement the IAlarmLib service contract in a service class.
public class AlarmLibService : IAlarmLib {
// Implement the IAlarmLib methods.
public bool CreateNoDataAlarm(string well, string run, string record, string description, string sel
ectedVariable) {
AlarmUserConfiguration newalarm = new AlarmUserConfiguration();
// The Machine name should be the machine which is running the client application
// and which calls the webservice. This should not be the name of machine hosting
// webservice.
newalarm.MachineName = System.Environment.MachineName;
newalarm.AlarmType = AlarmTypes.NoData;
newalarm.TimeInSeconds = 30;
DateTime CreationTime = DateTime.Now;
newalarm.Name = "NoDataAlarm " + CreationTime.ToString();
PrimaryKey key = new PrimaryKey();
key.Well = "Well ID 1";
key.Run = "1600";
key.Record = "DGR";
key.Desc = "Realtime";
key.SelectedVariable = "Gamma Ray A";
newalarm.PrimaryKeys = key;
// Add any of the following activities.
/*"All"
"Trip Out"
"Trip In"
"Circulating"
"Drilling On Bottom"
"Drilling Off Bottom"*/
newalarm.TDActivities.Add("Drilling On Bottom");
bool bStatus = AlarmUtilities.AddNewAlarm(newalarm, "-Local-");
return bStatus;
}
}
public class AlarmLibWindowsService : ServiceBase {
public ServiceHost serviceHost = null;
public AlarmLibWindowsService() {
// Name the Windows Service
ServiceName = "AlarmLibWS";
}
public static void Main() {
ServiceBase.Run(new AlarmLibWindowsService());
}
// Start the Windows service.
protected override void OnStart(string[] args) {
if (serviceHost != null) {
serviceHost.Close();
}
// Create a ServiceHost for the AlarmLibService type and
// provide the base address.
serviceHost = new ServiceHost(typeof(AlarmLibService));
// Open the ServiceHostBase to create listeners and start
// listening for messages.
serviceHost.Open();
}
protected override void OnStop() {
if (serviceHost != null) {
serviceHost.Close();
serviceHost = null;
}
}
}
// Provide the ProjectInstaller class which allows
// the service to be installed by the Installutil.exe tool
[RunInstaller(true)]
public class ProjectInstaller : Installer {
private ServiceProcessInstaller process;
private ServiceInstaller service;
public ProjectInstaller() {
process = new ServiceProcessInstaller();
process.Account = ServiceAccount.LocalSystem;
service = new ServiceInstaller();
service.ServiceName = "AlarmLibWS";
Installers.Add(process);
Installers.Add(service);
}
}
}
App.config中:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<!-- This section is optional with the new configuration model
introduced in .NET Framework 4. -->
<service name="ServiceModel.WindowsServices.AlarmLibService" behaviorConfiguration="AlarmLibServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/ServiceModel/service"/>
</baseAddresses>
</host>
<!-- this endpoint is exposed at the base address provided by host: http://localhost:8000/ServiceModel/service -->
<endpoint address=""
binding="wsHttpBinding"
contract="ServiceModel.WindowsServices.IAlarmLib" />
<!-- the mex endpoint is exposed at http://localhost:8000/ServiceModel/service/mex -->
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="AlarmLibServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
控制台应用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestAlarmLibConsoleApp {
class Program {
static void Main(string[] args) {
ServiceReference1.AlarmLibClient client = new ServiceReference1.AlarmLibClient();
bool result = client.CreateNoDataAlarm("Well ID 1", "1100", "DGR", "Realtime", "Gamma Ray A");
Console.WriteLine("result = " + bool.TrueString);
}
}
}
以下是有效的表单应用中的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using AlarmLib;
namespace TestCallingAlarmLib {
static class Program {
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
bool result = CreateNoDataAlarm();
Application.Run(new Form1());
}
static bool CreateNoDataAlarm() {
AlarmUserConfiguration newalarm = new AlarmUserConfiguration();
// The Machine name should be the machine which is running the client application
// and which calls the webservice. This should not be the name of machine hosting
// webservice.
newalarm.MachineName = System.Environment.MachineName;
newalarm.AlarmType = AlarmTypes.NoData;
newalarm.TimeInSeconds = 30;
DateTime CreationTime = DateTime.Now;
newalarm.Name = "NoDataAlarm " + CreationTime.ToString();
PrimaryKey key = new PrimaryKey();
key.Well = "Well ID 1";
key.Run = "1100";
key.Record = "DGR";
key.Desc = "Realtime";
key.SelectedVariable = "Gamma Ray A";
newalarm.PrimaryKeys = key;
// Add any of the following activities.
/*"All"
"Trip Out"
"Trip In"
"Circulating"
"Drilling On Bottom"
"Drilling Off Bottom"*/
newalarm.TDActivities.Add("Drilling On Bottom");
bool bStatus = AlarmUtilities.AddNewAlarm(newalarm, "-Local-");
return bStatus;
}
}
}
答案 0 :(得分:1)
检查您的客户端访问策略,确保在服务器上打开了端口并仔细检查防火墙。每次我收到这个错误都与其中一个有关。