我有一个WCF服务,其中包含一个实现IContractBehavior
和IWsdlExportExtension
的类,该类生成一个具有用户允许操作的WSDL,并排除他们无权访问的操作和类型。
但是,对于每个用户,我必须手动更改我为哪个用户生成WSDL。
我想通过将用户作为元数据请求的一部分传递来修复此限制。
localhost/service.svc?user=me
localhost:9766/service.svc?singleWsdl&user=me
或者,只要生成的WSDL被展平,我就可以使用svcutil
。
答案 0 :(得分:0)
我可以通过以下方式让这个工作
IContractBehavior
的端点,将所需的参数传递到IContractBehavior
类。 Metatadaset
代码
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");
}
}
}