将参数传递给WCF元数据

时间:2017-01-02 11:33:01

标签: c# wcf wsdl

我有一个WCF服务,其中包含一个实现IContractBehaviorIWsdlExportExtension的类,该类生成一个具有用户允许操作的WSDL,并排除他们无权访问的操作和类型。

但是,对于每个用户,我必须手动更改我为哪个用户生成WSDL。

我想通过将用户作为元数据请求的一部分传递来修复此限制。

  • localhost/service.svc?user=me
  • localhost:9766/service.svc?singleWsdl&user=me

或者,只要生成的WSDL被展平,我就可以使用svcutil

1 个答案:

答案 0 :(得分:0)

我可以通过以下方式让这个工作

代码

const string BASE_ADDRESS = 
"http://localhost:8731/Design_Time_Addresses/CalcService";
var uri = new Uri(BASE_ADDRESS);
var user = "userName";

using (var serviceHost = new ServiceHost(typeof(Calc), uri))
{
  var exporter = new WsdlExporter();
  var endpoint = serviceHost.AddServiceEndpoint(typeof(ICalc),
  new BasicHttpBinding(), "");
  endpoint.Contract.Behaviors.Add(new
  RestrictedOperationsWsdlExportExtensionAttribute(user));
  serviceHost.Open();
  Console.WriteLine("The service is ready: " + user);
  exporter.ExportEndpoint(endpoint);
  if (exporter.Errors.Count == 0)
  {
    var metadataSet = exporter.GetGeneratedMetadata();
    var asy= Assembly.GetAssembly(typeof(WsdlExporter));
    var t = asy.GetType("System.ServiceModel.Description.WsdlHelper",
      true);
    var method = t.GetMethod("GetSingleWsdl", 
      System.Reflection.BindingFlags.Public 
      | System.Reflection.BindingFlags.Static);
    var serviceDescription =
      method.Invoke(null, new object[] {metadataSet})
      as System.Web.Services.Description.ServiceDescription;
    if (serviceDescription != null)
    {
      serviceDescription.Name = "Calc";
      serviceDescription.Write(user + ".wsdl");
    }
  }
}