ServiceStack:VS 2012 添加服务参考

Posted

技术标签:

【中文标题】ServiceStack:VS 2012 添加服务参考【英文标题】:ServiceStack: VS 2012 Add service reference 【发布时间】:2015-05-04 06:07:03 【问题描述】:

我在向我的 soap 端点添加服务引用时遇到问题。我什至尝试在 SS 网站上添加 hello 示例的地址 http://mono.servicestack.net/soap11,但无法生成 wsdl。我所有的 dto(在我的项目中)都装饰有数据合同/成员。我还更改了程序集以指向目标命名空间。我尝试将其添加为 Web 参考,并将参考程序集中的重用类型标记为关闭,但仍然没有运气。有什么我忘记做的吗?如果需要更多信息,请告诉我。

using ServiceStack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WILP_API

    public class ApplicationHost : AppHostBase
    
        public ApplicationHost() : base("GreetingService", typeof(GreetingService).Assembly)  

        public override void Configure(Funq.Container container)
        
            //throw new NotImplementedException();
        
    
​
using ServiceStack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Web;

namespace WILP_API

    [Route("/hello/Name","GET")]
    [DataContract(Namespace="WILP_API")]
    public class GreetingRequest
    
        [DataMember]
        public string Name  get; set; 
    

using ServiceStack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Web;

namespace WILP_API

    [Route("/hello/Name", "GET")]
    [DataContract(Namespace="WILP_API")]
    public class GreetingResponse
    
        [DataMember]
        public string Result  get; set; 
    
​
using ServiceStack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WILP_API

    public class GreetingService : IService
    
        public GreetingResponse Any(GreetingRequest request)
        
            GreetingResponse response = new GreetingResponse();
            response.Result = "Hello, " + request.Name + "!";
            return response;
        
    
​
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("WILP_API")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("WILP_API")]
[assembly: AssemblyCopyright("Copyright ©  2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components.  If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("133bdb3e-442d-45ad-9cc2-02fbcd50c8ac")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Revision and Build Numbers 
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: ContractNamespace("http://schemas.servicestack.net/types",
           ClrNamespace = "WILP_API")]
[assembly: ContractNamespace("http://schemas.servicestack.net/types", ClrNamespace = "ServiceStack")]
[assembly: ContractNamespace("http://schemas.servicestack.net/types", ClrNamespace = "ServiceStack.Client")]​

错误:

错误 5 自定义工具错误:无法为服务生成代码 参考“ServiceReference3”。请检查其他错误和警告 消息了解详情。

警告 3 自定义工具警告:无法导入 wsdl:binding 详细信息: 导入 wsdl:binding 所在的 wsdl:portType 时出错 依赖于。 wsdl:portType 的 XPath: //wsdl:definitions[@targetNamespace='http://schemas.servicestack.net/types']/wsdl:portType[@name='ISyncReply'] 错误源的 XPath: //wsdl:definitions[@targetNamespace='http://schemas.servicestack.net/types']/wsdl:binding[@name='BasicHttpBinding_ISyncReply']

警告 4 自定义工具警告:无法导入 wsdl:port 详细信息:那里 导入 wsdl:binding 时出错,该 wsdl:port 依赖于该绑定 在。 wsdl 的 XPath:绑定: //wsdl:definitions[@targetNamespace='http://schemas.servicestack.net/types']/wsdl:binding[@name='BasicHttpBinding_ISyncReply'] 错误源的 XPath: //wsdl:definitions[@targetNamespace='http://schemas.servicestack.net/types']/wsdl:service[@name='SyncReply']/wsdl:port[@name='BasicHttpBinding_ISyncReply']

警告 2 自定义工具警告:无法导入 wsdl:portType 详细信息:An 运行 WSDL 导入扩展时引发异常: System.ServiceModel.Description.DataContractSerializerMessageContractImporter 错误:加载提供的 XSD 文档时出现问题:a 引用名为“GreetingRequest”的架构元素和 命名空间“http://schemas.servicestack.net/types”不能 已解决,因为在 targetNamespace 'http://schemas.servicestack.net/types' 的架构。 请检查提供的 XSD 文档,然后重试。错误的 XPath 资源: //wsdl:definitions[@targetNamespace='http://schemas.servicestack.net/types']/wsdl:portType[@name='ISyncReply']

【问题讨论】:

请删除所有code snippet 部分,因为这些是 C# 代码,并将您的错误和警告消息显示为文本而不是图像。 我很抱歉。我希望这种格式更好。 【参考方案1】:

您应确保所有 DTO 仅使用 single WSDL Namespace。由于 ServiceStack 内置 DTO 已使用 http://schemas.servicestack.net/types 定义,因此这是最简单的方法,建议您坚持通过在 Assembly.cs 中添加程序集 [ContractNamespace] 属性来执行此操作,例如:

[assembly: ContractNamespace("http://schemas.servicestack.net/types",
           ClrNamespace = "WILP_API")]

这将适用于 WILP_API 命名空间下该程序集中的所有 DTO,因此它们不再需要在 DTO 上定义命名空间,例如:

[Route("/hello/Name","GET")]
[DataContract]
public class Greeting : IReturn<GreetingResponse>

    [DataMember]
    public string Name  get; set; 


[DataContract]
public class GreetingResponse

    [DataMember]
    public string Result  get; set; 

也只有请求 DTO 使用[Route] 属性。你也应该关注Greeting/GreetingResponseRequest/Response DTO Naming Convention。

更改 WSDL 命名空间

如果您必须更改它,建议坚持使用默认的 ServiceStack 命名空间,但您还需要在 HostConfig 中配置不同的命名空间,例如:

SetConfig(new HostConfig 
    WsdlServiceNamespace = "http://new.namespace.com",
);

Add ServiceStack Reference

您应该考虑使用ServiceStack's new Add ServiceStack Reference,而不是使用 SOAP 端点和 WSDL,它提供了许多 advantages over WCF's SOAP Add Service Reference。

【讨论】:

谢谢。我确实阅读了该部分一百万次,但一定认为 ServiceStack 是我的命名空间。我会投票,但我没有足够的代表。无论如何,这就是答案。再次感谢【参考方案2】:

我最近刚刚经历过这种情况,我想专门扩展上述答案。事实证明,在我的情况下,100% 与使用的命名约定有关。

当 SS 生成一个 wsdl 时,推荐的命名约定 here 在某种程度上被强制执行。我不确定它是有意的还是错误的,但是在 VS 中添加标准 .Net 服务引用时,以“请求”结束请求 DTO(至少截至 2017 年 1 月)会导致这三个警告和失败。

【讨论】:

以上是关于ServiceStack:VS 2012 添加服务参考的主要内容,如果未能解决你的问题,请参考以下文章

VS 2008上的ServiceStack.redis配置

ServiceStack NetCoreAppSettings 配置文件读取和设置

vs2012怎么添加web引用

使用 ServiceStack 使用 REST Web 服务时的用户身份验证

VS2012 添加服务参考不更新配置文件

具有多个数据库服务器的 ServiceStack OrmLite