尝试在Win 7系统上运行自托管应用,收效甚微。该应用程序启动但我无法从WCF测试客户端访问它或通过在VS中添加引用。我已经阅读了类似问题的1000个帖子,但似乎没有一个解决方案适合。
我这样做了:
netsh http add urlacl url=http://+:9090/hello user=LocalPC\UserName
然后这个:
netsh http add iplisten ipaddress=0.0.0.0:9090
这是执行
的代码void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Uri baseAddress = new Uri("http://localhost:9090/hello");
// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
// Enable metadata publishing.
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);
// Add MEX endpoint
host.AddServiceEndpoint(
ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex");
// Add application endpoint
host.AddServiceEndpoint(typeof(IHelloWorldService), new WSHttpBinding(), "");
// Open the ServiceHost to start listening for messages. Since
// no endpoints are explicitly configured, the runtime will create
// one endpoint per base address for each service contract implemented
// by the service.
try
{
host.Open();
}
catch (Exception excep)
{
string s = excep.Message;
}
}
}
当我尝试从WCF测试客户端访问时,我得到:
错误:无法从http://localhost:9090/hello获取元数据如果这是您所使用的Windows(R)Communication Foundation服务 有权访问,请检查您是否已启用元数据发布 指定的地址。有关启用元数据发布的帮助,请 请参阅MSDN文档 http://go.microsoft.com/fwlink/?LinkId=65455。
WS-Metadata Exchange错误URI:http://localhost:9090/hello
元数据包含一个无法解析的引用:'http:// localhost:9090 / hello' 没有端点在http://localhost:9090/hello监听 可以接受这个消息。这通常是由错误的地址引起的 或SOAP动作。有关详细信息,请参阅InnerException(如果存在) 无法连接到远程服务器无法建立连接 因为目标机器主动拒绝它127.0.0.1:9090
HTTP GET错误URI:http://localhost:9090/hello发生错误 下载'http:// localhost:9090 / hello'。无法连接到 远程服务器因为目标,无法建立连接 机器主动拒绝它127.0.0.1:9090
当我尝试添加服务引用时,我得到:
下载'http:// localhost:9090 / hello'时出错 无法连接到远程服务器
由于目标机器主动拒绝,因此无法建立连接 127.0.0.1:9090
元数据包含一个无法解析的引用:'http:// localhost:9090 / hello' 在http://localhost:9090/hello没有可以接受的端点收听 信息。这通常是由错误的地址或SOAP操作引起的。看到 InnerException(如果存在),以获取更多详细信息 无法连接到远程服务器
由于目标机器主动拒绝它,因此无法建立连接127.0.0.1:9090
如果在当前解决方案中定义了服务,请尝试构建解决方案并再次添加服务引用。
答案 0 :(得分:2)
问题是你让ServiceHost立即超出范围。
当该代码块超出范围时,using语句可以方便地进行清理,但是没有任何措施可以防止这种情况发生。所以从本质上讲,你是打开连接,但它几乎立即被处理......这将关闭连接。
只要您没有遇到任何权限问题,这种方法应该适合您。话虽如此,这只是演示软件。实际上,您可能不希望您的WCF服务直接绑定到您的表单,而是在应用程序级别定义。
public partial class WcfHost : Form
{
private ServiceHost _svcHost;
private Uri _svcAddress = new Uri("http://localhost:9001/hello");
public WcfHost()
{
_svcHost = new ServiceHost(typeof(HelloWorldService), _svcAddress);
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
_svcHost.Description.Behaviors.Add(smb);
InitializeComponent();
FormClosing += WcfHost_FormClosing;
}
private void WcfHost_Load(object sender, EventArgs e)
{
try
{
_svcHost.Open(TimeSpan.FromSeconds(10));
lblStatus.Text = _svcHost.State.ToString();
}
catch(Exception ex)
{
lblStatus.Text = ex.Message;
}
}
void WcfHost_FormClosing(object sender, FormClosingEventArgs e)
{
_svcHost.Close();
lblStatus.Text = _svcHost.State.ToString();
}
}
[ServiceContract]
public interface IHelloWorldService
{
[OperationContract]
string SayHello(string name);
}
public class HelloWorldService : IHelloWorldService
{
public string SayHello(string name)
{
return string.Format("Hello, {0}", name);
}
}