如何从现有的 WSDL 和 XSD 文件生成 WCF 服务主机
Posted
技术标签:
【中文标题】如何从现有的 WSDL 和 XSD 文件生成 WCF 服务主机【英文标题】:How to Generate WCF Service HOST from Existing WSDL & XSD Files 【发布时间】:2013-09-27 04:53:42 【问题描述】:我有来自我们的一台服务器的现有 WSDL 和 XSD 文件,该服务器使用 WAS(Windows 激活服务)运行带有 ASP.NET 4.5 的 IIS 8。我正在为该项目使用 VS 2012。我没有 WCF 服务主机的原始代码,因此我需要从现有的 WSDL 和 XSD 文件创建 WCF 主机。
我已经有客户端代理代码,即客户端已完成。
我需要从现有的 WSDL 和 XSD 文件生成将在 IIS 8 服务器中托管的 WCF 服务主机?不是客户端代理代码 - 我已经完成了。
我有以下文件
-
myMainService.wsdl
mySubService.wsdl
myFirstXSD.xsd
mySecondXSD.xsd
myServiceSingleWSDL.wsdl
客户端代理代码(完成)
测试客户端(完成)
注意:MyMainService.wsdl 指向 mySubService.wsdl,其中包含调用 myFirstXSD.xsd 和 mySecondXSD.xsd 的代码 我也有单个 WSDL,即 myServiceSingleWSDL.wsdl
我阅读了如何使用 SvcUtil.exe 和 Disco.exe,但我不确定如何正确使用。大多数类似的问题都没有回答问题,而只是绕过它。
如果您可以包含用于执行此操作的命令,请逐步说明。任何帮助将不胜感激。
所以我运行以下命令从上述文件生成下面的代码 SvcUtil /mc /language:C# /out:IService1.cs /n:*,Contoso.WcfServiceHost MyMainService.wsdl MySubService.wsdl MyFirstXSD.xsd MySecondXSD.xsd
从这里开始下一步是什么?生成将托管在 IIS 8 中的 WCF 服务主机,以便客户端可以连接到它或使用它
这里生成的 Web.config 文件
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IMyService">
<security mode="None" />
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://contoso.com/MyService.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IMyService"
contract="IMyService" name="WSHttpBinding_IMyService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"></serviceHostingEnvironment>
</system.serviceModel>
</configuration>
下面是生成的Iservice1.cs文件
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.18051
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Contoso.WcfServiceHost
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://contoso.com/MyService.svc", ConfigurationName = "IMyService")]
public interface IMyService
[System.ServiceModel.OperationContractAttribute(Action = "http://contoso.com/MyService.svc/IMyService/Login", ReplyAction = "http://contoso.com/MyService.svc/IMyService/LoginResponse")]
LoginResponse Login(LoginRequest request);
[System.ServiceModel.OperationContractAttribute(Action = "http://contoso.com/MyService.svc/IMyService/Login", ReplyAction = "http://contoso.com/MyService.svc/IMyService/LoginResponse")]
System.Threading.Tasks.Task<LoginResponse> LoginAsync(LoginRequest request);
[System.ServiceModel.OperationContractAttribute(Action = "http://contoso.com/MyService.svc/IMyService/Logout", ReplyAction = "http://contoso.com/MyService.svc/IMyService/LogoutResponse")]
LogoutResponse Logout(LogoutRequest request);
[System.ServiceModel.OperationContractAttribute(Action = "http://contoso.com/MyService.svc/IMyService/Logout", ReplyAction = "http://contoso.com/MyService.svc/IMyService/LogoutResponse")]
System.Threading.Tasks.Task<LogoutResponse> LogoutAsync(LogoutRequest request);
[System.ServiceModel.OperationContractAttribute(Action = "http://contoso.com/MyService.svc/IMyService/GetId", ReplyAction = "http://contoso.com/MyService.svc/IMyService/GetIdResponse")]
GetIdResponse GetId(GetIdRequest request);
[System.ServiceModel.OperationContractAttribute(Action = "http://contoso.com/MyService.svc/IMyService/GetId", ReplyAction = "http://contoso.com/MyService.svc/IMyService/GetIdResponse")]
System.Threading.Tasks.Task<GetIdResponse> GetIdAsync(GetIdRequest request);
[System.ServiceModel.MessageContractAttribute(WrapperName = "Login", WrapperNamespace = "http://contoso.com/MyService.svc", IsWrapped = true)]
public partial class LoginRequest
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://contoso.com/MyService.svc", Order = 0)]
public string login;
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://contoso.com/MyService.svc", Order = 1)]
public string password;
public LoginRequest()
public LoginRequest(string login, string password)
this.login = login;
this.password = password;
[System.ServiceModel.MessageContractAttribute(WrapperName = "LoginResponse", WrapperNamespace = "http://contoso.com/MyService.svc", IsWrapped = true)]
public partial class LoginResponse
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://contoso.com/MyService.svc", Order = 0)]
public System.Guid LoginResult;
public LoginResponse()
public LoginResponse(System.Guid LoginResult)
this.LoginResult = LoginResult;
[System.ServiceModel.MessageContractAttribute(WrapperName = "Logout", WrapperNamespace = "http://contoso.com/MyService.svc", IsWrapped = true)]
public partial class LogoutRequest
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://contoso.com/MyService.svc", Order = 0)]
public System.Guid sessionId;
public LogoutRequest()
public LogoutRequest(System.Guid sessionId)
this.sessionId = sessionId;
[System.ServiceModel.MessageContractAttribute(WrapperName = "LogoutResponse", WrapperNamespace = "http://contoso.com/MyService.svc", IsWrapped = true)]
public partial class LogoutResponse
public LogoutResponse()
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetId", WrapperNamespace = "http://contoso.com/MyService.svc", IsWrapped = true)]
public partial class GetIdRequest
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://contoso.com/MyService.svc", Order = 0)]
public System.Guid sessionId;
public GetIdRequest()
public GetIdRequest(System.Guid sessionId)
this.sessionId = sessionId;
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetIdResponse", WrapperNamespace = "http://contoso.com/MyService.svc", IsWrapped = true)]
public partial class GetIdResponse
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://contoso.com/MyService.svc", Order = 0)]
public long GetIdResult;
public GetIdResponse()
public GetIdResponse(long GetIdResult)
this.GetIdResult = GetIdResult;
public interface IMyServiceChannel : IMyService, System.ServiceModel.IClientChannel
public partial class MyServiceClient : System.ServiceModel.ClientBase<IMyService>, IMyService
public MyServiceClient()
public MyServiceClient(string endpointConfigurationName) :
base(endpointConfigurationName)
public MyServiceClient(string endpointConfigurationName, string remoteAddress) :
base(endpointConfigurationName, remoteAddress)
public MyServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
base(endpointConfigurationName, remoteAddress)
public MyServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
base(binding, remoteAddress)
public LoginResponse Login(LoginRequest request)
return base.Channel.Login(request);
public System.Threading.Tasks.Task<LoginResponse> LoginAsync(LoginRequest request)
return base.Channel.LoginAsync(request);
public LogoutResponse Logout(LogoutRequest request)
return base.Channel.Logout(request);
public System.Threading.Tasks.Task<LogoutResponse> LogoutAsync(LogoutRequest request)
return base.Channel.LogoutAsync(request);
public GetIdResponse GetId(GetIdRequest request)
return base.Channel.GetId(request);
public System.Threading.Tasks.Task<GetIdResponse> GetIdAsync(GetIdRequest request)
return base.Channel.GetIdAsync(request);
【问题讨论】:
源代码就这些了吗?您所拥有的是客户端代理的代码。如果这是承包商给你的所有东西,那么你没有服务的代码。 【参考方案1】:svcutil.exe 不会为您生成服务代码(听起来您已经发现了)。
如果原始服务由您/您的公司创建或拥有,或者您拥有源代码的合法权利,您可以使用Reflector、JustDeCompile 或类似工具(Reflector 提供免费试用,但您必须为长期使用付费,JustDecompile 是免费的,但不如 Reflector 灵活)对 DLL/EXE 进行逆向工程(假设您可以访问 DLL/EXE)。
如果这不是您的选择,您可以研究合同优先开发,尽管我自己从未使用过它:
Schema-based Development with Windows Communication Foundation
我还看到了对 Thinktecture 的 WSCF.blue 的引用,这可能值得一看。
【讨论】:
我们从开发者那里购买了原始源代码,但他从未给我们提供服务器端代码。当我们要求提供服务器端代码时,他在项目延迟 2 个月后想要更多的钱。我们有一个源代码和 DLL,但看着它,看起来像客户端代理代码。具有Service Contract和Data Contract的普通属性 @user2712741 - 您是否在服务器上托管服务?如果您有法律部门,您可能会询问他们对 DLL 进行逆向工程的合法性。在我的(有限的)经验中,这是一个灰色地带。标有[ServiceContract]
的代码是否是一个接口(我希望它是),是否有实现该接口的类?
我是个人开发者。所以我没有法律部门。我签约的开发人员将服务托管在他在合同开发期间设置的测试 IIS 8 网络服务器上。我们有源代码和 DLL,但我不确定交付的是客户端代理代码和服务器端 WCF 服务主机代码。我已经完成了它,但它似乎不是 WCF 服务服务器端代码(要在 IIS8 上托管的 WCF 服务,以便客户端可以使用或访问它)。我想在我自己的 IIS 8 上托管服务,但是需要程序员社区的帮助
没有看到您正在查看的代码,我无法确定您是否有服务代码。您是否能够(或愿意)将您有问题的代码(或指向它的链接)放入其中?这里有人可以告诉你是否拥有所有必要的源代码。
svcutil.exe
当然必须生成服务接口。您可以从那里编写一个实现。然而...这是合同的问题之一...如果它在原始合同之外,这可能会很棘手。以上是关于如何从现有的 WSDL 和 XSD 文件生成 WCF 服务主机的主要内容,如果未能解决你的问题,请参考以下文章