gpt4 book ai didi

asp.net-mvc - 为 IIS 托管的 .SVC 文件配置 XML-RPC 行为?

转载 作者:行者123 更新时间:2023-12-02 07:32:34 24 4
gpt4 key购买 nike

我正在使用Clemens Vasters' XML-RPC 实现用于实现 XML-RPC 端点。当我在控制台应用程序中托管该服务时,它工作正常。

我想将其托管在 ASP.NET MVC 应用程序中,因此我使用 .SVC 文件。这是部分有效的。当我浏览到 .SVC 文件时,我会看到常见的“您已创建服务”内容。

但是,当我将 XML-RPC 客户端(Windows Live Writer)指向同一位置时,我收到“400 错误请求”。我猜测这是因为我的服务没有正确公开为 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 跟踪,我会在日志文件中看到“无法识别的消息版本”。

最佳答案

以下是实现此功能的步骤:

  1. 下载XML-RPC for WCF sample
  2. 该解决方案包含 3 个项目:Microsoft.Samples.XmlRpcTinyBlogEngineTinyBlogEngineClient
  3. 向 ASP.NET 类型的解决方案添加第四个项目(我将其称为 TinyBlogEngineWeb)

在新项目中引用Microsoft.Samples.XmlRpcTinyBlogEngine

将 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); }
}
}
}

最后,web.configsystem.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 .

关于asp.net-mvc - 为 IIS 托管的 .SVC 文件配置 XML-RPC 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3097020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com