我想在ASP.NET MVC应用程序中托管它,所以我使用的是.SVC文件.这部分有效.当我浏览.SVC文件时,我看到通常的“你已经创建了一个服务”的东西.
但是,当我将XML-RPC客户端(Windows Live Writer)指向同一位置时,我收到“400 Bad Request”.我猜这是因为我的服务没有正确公开为XML-RPC.
我试过configure an endpoint behavior in Web.config,如下:
<system.serviceModel> <services> <service name="AnotherBlogEngine.Web.Api.BlogApi"> <endpoint address="" binding="webHttpBinding" contract="AnotherBlogEngine.Web.Api.IBlogApi" behaviorConfiguration="xmlRpcBehavior" /> </service> </services> <extensions> <behaviorExtensions> <add name="xmlRpc" type="AnotherBlogEngine.XmlRpc.XmlRpcEndpointBehaviorElement,\ AnotherBlogEngine.XmlRpc" /> </behaviorExtensions> </extensions> <behaviors> <endpointBehaviors> <behavior name="xmlRpcBehavior"> <xmlRpc/> </behavior> </endpointBehaviors> </behaviors> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
……但它不起作用.我究竟做错了什么?我的Web.config是否正确,还是我完全错了?我是否需要在.SVC文件中提供自定义工厂来整理行为?
顺便说一句,.SVC文件看起来像这样:
<%@ ServiceHost Language="C#" Debug="true" Service="AnotherBlogEngine.Publishing.Service.BlogApi,\ AnotherBlogEngine.Publishing.Service" %>
注意:那些反斜杠实际上并不存在;它们只是用于包装线.
此外,目前,我只是在Cassini(VS2010)中测试它,而不是IIS,但我将瞄准IIS 7.x.
更新:它肯定至少在查看我的扩展:它调用XmlRpcEndpointBehaviorElement.get_BehaviorType,如果XmlRpcEndpointBehavior没有实现IEndpointBehavior,我会收到一个错误(显示代替“你已创建服务”页面).
但是,任何一个类中其他方法的断点都不会受到影响.
如果我打开WCF跟踪,我会在日志文件中看到“无法识别的消息版本”.
解决方法
>下载XML-RPC for WCF sample
>该解决方案包含3个项目:Microsoft.Samples.XmlRpc,TinyBlogEngine和TinyBlogEngineClient.
>将第四个项目添加到ASP.NET类型的解决方案中(我称之为TinyBlogEngineWeb)
在新项目中引用Microsoft.Samples.XmlRpc和TinyBlogEngine.
<%@ ServiceHost Language="C#" Debug="true" Service="TinyBlogEngine.BloggerAPI,TinyBlogEngine" %>
将XmlRpcEndpointBehaviorExtension类添加到新项目:
namespace TinyBlogEngineWeb { public class XmlRpcEndpointBehaviorExtension : BehaviorExtensionElement { protected override object CreateBehavior() { // this comes from Microsoft.Samples.XmlRpc return new XmlRpcEndpointBehavior(); } public override Type BehaviorType { get { return typeof(XmlRpcEndpointBehavior); } } } }
最后,web.config的system.serviceModel部分应如下所示:
<system.serviceModel> <services> <service name="TinyBlogEngine.BloggerAPI" behaviorConfiguration="returnFaults"> <endpoint address="/blogger" binding="webHttpBinding" contract="TinyBlogEngine.IBloggerAPI" behaviorConfiguration="xmlRpcBehavior" /> </service> </services> <behaviors> <serviceBehaviors> <behavior name="returnFaults"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="xmlRpcBehavior"> <xmlRpc/> </behavior> </endpointBehaviors> </behaviors> <extensions> <behaviorExtensions> <add name="xmlRpc" type="TinyBlogEngineWeb.XmlRpcEndpointBehaviorExtension,TinyBlogEngineWeb" /> </behaviorExtensions> </extensions> </system.serviceModel>
最后修改控制台客户端应用程序以使用Web项目的地址并测试:
Uri blogAddress = new UriBuilder( Uri.UriSchemeHttp,"localhost",1260,// use the appropriate port here "/test.svc/blogger" ).Uri;
使用Windows Live Writer和控制台客户端应用程序进行测试.你可以download my test solution from here.