我需要调试WCF服务,但它需要有一个HTTP上下文。
目前我有一个WCF服务网站的解决方案,当我点击调试启动时,然后启动一个不包含测试表单的html页面。
当项目运行时,我尝试手动启动wcftestclient,然后提供服务的地址,它找到服务但是当我调用它时,它会绕过IIS层(或开发服务器),因此httpContext为null。 ..
通过IIS上下文调试WCF服务的正确方法是什么?
答案 0 :(得分:9)
在WCF中,默认情况下,HttpContext设置为NULL,即使WCF服务托管在IIS中也是如此;毕竟,WCF 不是 ASP.NET。
如果你确实需要一个HttpContext,你需要单独打开它,通过config(web.config
如果你在IIS中托管,你的自托管应用程序app.config
否则):
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
并且您需要通过将此属性放在服务类(实现服务协定)上来指定该事实(您的服务允许甚至期望ASP.NET兼容模式):
[AspNetCompatibilityRequirements
(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
public class MyWCFService : IMyWCFService
{
......
}
RequirementsMode=Allowed
只是简单地允许ASP.NET兼容模式,而RequirementsMode=Required
实际需要的是,如果没有它,它将无法工作。
执行此操作后,在将调试程序附加到IIS工作进程时,应该获得HttpContext.Current
。
马克
答案 1 :(得分:1)
您必须将调试器(Visual Studio)附加到IIS服务进程。
在Visual Studio中,转到Debug - &gt;附加到进程并在“附加到进程”对话框中选择IIS进程。
在IIS7上,进程的名称是w3wp.exe,但您可能需要在其之前选择显示所有用户的进程或在所有会话中显示进程变得可用。
当调试器正确连接到IIS进程时,您可以在代码中设置一个或多个断点并调用该服务。
答案 2 :(得分:1)
您必须附加到IIS进程,即XP下的aspnet_wp.exe和2003服务器上的w3wp.exe。这样你就会遇到断点等。
如果您正在寻找测试WCF服务本身的方法,我建议您使用WcfTestClient。
请记住,在您至少点击一次服务器之前,IIS进程不会显示在任务管理器中(例如,重启后,您必须至少在服务器上点击一次才能完成此过程启动)。
答案 3 :(得分:1)
感谢解决方案。我遇到了同样的问题。 我的解决方案现在使用2个svc文件正常工作。
为了解决问题我做了两处改动
在Web.Config中我评论了行
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
和
在实现接口的类上添加了属性 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 。