2017-01-02 134 views
0

我有一个WCF服务,其类实现了IContractBehaviorIWsdlExportExtension,该类使用用户允许的操作生成WSDL,并排除他们无权访问的操作和类型。将参数传递到WCF元数据

但是这个限制是,对于每个用户,我必须手动更改我为其生成WSDL的用户。

我想通过作为元数据请求的一部分传入用户来解决此限制。

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

我也可以用svcutil也只要所产生的WSDL是扁平的工作。

回答

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