代码之家  ›  专栏  ›  技术社区  ›  Roger Lipscombe

为以IIS为宿主的.svc文件配置XML-RPC行为?

  •  4
  • Roger Lipscombe  · 技术社区  · 16 年前

    我在用 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中测试,但我将把它瞄准IIs7.x。

    更新: 它肯定至少在看我的分机:它打电话 XmlRpcEndpointBehaviorElement.get_BehaviorType 如果 XmlRpcEndpointBehavior 不执行 IEndpointBehavior ,我会得到一个这样的错误(显示在“您已经创建了一个服务”页面的位置)。

    但是,任何一个类中其他方法上的断点都不会被命中。

    如果我打开WCF跟踪,我会在日志文件中看到“无法识别的消息版本”。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Darin Dimitrov    16 年前

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

    1. 下载 XML-RPC for WCF sample
    2. 该解决方案包含3个项目: Microsoft.Samples.XmlRpc , TinyBlogEngine TinyBlogEngineClient .
    3. 在ASP.NET类型的解决方案中添加第四个项目(我称之为 TinyBlogEngineWeb )

    在新项目参考中 Microsoft.samples.xmlrpc(Microsoft.samples.xmlrpc) TyyByb引擎 .

    将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 部分 web.config 应该如下所示:

    <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 .