我正在尝试关注博客文章 Using a REST WCF Service 。
但我不知道Global.asax页面在哪里。从博客中添加该位是否很重要?
当我尝试使用以下代码从我的Windows Forms应用程序进行连接时:
private void button1_Click(object sender, EventArgs e)
{
using (ChannelFactory<ServiceReference1.IService1> factory = new
ChannelFactory<ServiceReference1.IService1>(
new WebHttpBinding(),
"http://localhost:8000/Hello"))
{
factory.Endpoint.Behaviors.Add(new WebHttpBehavior());
var helloService = factory.CreateChannel();
label1.Text = helloService.GetData(Convert.ToString(textBox1.Text));
// The above line
}
}
我收到此错误:
Could not connect to http://localhost:8000/Hello/GetData. TCP error
code 10061: No connection could be made because the target machine
actively refused it 127.0.0.1:8000.
我的其他项目中的Web.Config文件是主机,如下所示:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<services>
<service name="WcfService2.Service1" behaviorConfiguration="WcfService2.Service1Behavior">
<!-- Service Endpoints -->
<endpoint address="http://localhost:29174/Service1.svc" binding="webHttpBinding" contract="WcfService2.IService1">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<!--<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>-->
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="webBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="WcfService2.Service1Behavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
这是我禁用的主机,只是单独运行了wcfservice:
namespace Host
{
class Program
{
static void Main(string[] args)
{
WebHttpBinding binding = new WebHttpBinding();
WebServiceHost host =
new WebServiceHost(typeof(Service1));
host.AddServiceEndpoint(typeof(IService1),
binding,
"http://localhost:8000/Hello");
host.Open(); // this line gives an error
Console.WriteLine("Hello world service");
Console.WriteLine("Press <RETURN> to end service");
Console.ReadLine();
}
}
}
当我尝试运行此操作时,我收到与博客和我的web.config
文件相关的错误:
此服务需要ASP.NET兼容性,并且必须在IIS中托管。 在启用了ASP.NET兼容性的IIS中托管服务 web.config或设置 AspNetCompatibilityRequirementsAttribute.AspNetCompatibilityRequirementsMode 属性为必需值以外的值。
我尝试在我的配置文件中评论该部分,但之后它不会运行。这可以解释为什么我无法连接我的Windows窗体应用程序。
但请注意,在我的web.config
文件和AspNetCompatibilityRequirementsAttribute.AspNetCompatibilityRequirementsMode
下面的代码中,两者都已设置:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class Service1 : IService1
{
public string GetData(string value)
{
return string.Format("You entered: {0}", value);
}
}
答案 0 :(得分:2)
global.asax页面是.NET个网站上的页面。它有点像网页的引导程序。当网页首次旋转时,它会执行所有启动操作(在这种情况下,将服务URL作为路由连接,但我不确定具体是什么,因为我从未亲自使用过该路由)。
关于您的错误,可能来自您的配置。它似乎指向localhost:29174
,但您的错误来自localhost:8000
。我不确定这是不是你的问题。但是,您可能还想在关闭防火墙的情况下尝试它,看看会发生什么,因为它可能是您的防火墙阻止了呼叫。
答案 1 :(得分:2)
您正在考虑的示例假定您正在制作一个托管在IIS中的ASP.NET Web应用程序,该文档将具有Global.asax
文件。
由于你是在一个控制台应用程序中托管它,你没有这个文件,如果把它放在那里它也不会做任何事情。
此外,在您的配置中,您有:
<endpoint address="http://localhost:29174/Service1.svc"
但是在你的代码中,
"http://localhost:8000/Hello"
这是非常不同的。
启动控制台应用程序时收到的错误说明:
此服务需要ASP.NET兼容性,并且必须在IIS中托管。在IIS中托管服务并在web.config中启用ASP.NET兼容性,或将AspNetCompatibilityRequirementsAttribute.AspNetCompatibilityRequirementsMode属性设置为值而不是。
但您的代码已将该属性设置为必需。控制台应用程序无法提供ASP.NET兼容模式,只有像IIS或Cassini或IIS Express这样的真实Web服务器才能提供。因此,当它设置为必需时会出现错误。您可以尝试将其设置为除必需之外的其他值,如错误消息所示。但是,如果没有ASP.NET兼容模式,某些其他内容可能无法正常工作。
最好的办法是在ASP.NET Web应用程序中重新开展工作,除非您真正计划制作必须作为控制台应用程序运行的真实项目或{{3} }。