将参数传递到 WCF 元数据

Passing parameter into WCF metadata

我有一个带有 class 的 WCF 服务,它实现了 IContractBehaviorIWsdlExportExtension,它生成一个包含用户允许的操作的 WSDL,并排除他们无权访问的操作和类型.

然而,这样做的局限性在于,对于每个用户,我必须手动更改为哪个用户生成 WSDL。

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

或者我可以使用 svcutil 也可以工作,只要生成的 WSDL 被展平。

我可以通过执行以下操作来实现它

代码

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