我正在使用Clemens Vasters' XML-RPC实现来实现XML-RPC端点。当我在控制台应用程序中托管服务时,它可以正常工作。
我想在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跟踪,我会在日志文件中看到“无法识别的消息版本”。
答案 0 :(得分:2)
以下是实现此目的的步骤:
Microsoft.Samples.XmlRpc
,TinyBlogEngine
和TinyBlogEngineClient
。TinyBlogEngineWeb
)在新项目参考Microsoft.Samples.XmlRpc
和TinyBlogEngine
中。
将test.svc文件添加到此Web应用程序,如下所示:
<%@ 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); }
}
}
}
最后,system.serviceModel
的{{1}}部分应如下所示:
web.config
最后修改控制台客户端应用程序以使用Web项目的地址并测试:
<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>
使用Windows Live Writer和控制台客户端应用程序进行测试。你可以download my test solution from here。