将参数传递到 WCF 元数据
Passing parameter into WCF metadata
我有一个带有 class 的 WCF 服务,它实现了 IContractBehavior
和 IWsdlExportExtension
,它生成一个包含用户允许的操作的 WSDL,并排除他们无权访问的操作和类型.
然而,这样做的局限性在于,对于每个用户,我必须手动更改为哪个用户生成 WSDL。
例如,我想通过将用户作为元数据请求的一部分传入来修复此限制。
localhost/service.svc?user=me
或
localhost:9766/service.svc?singleWsdl&user=me
或者我可以使用 svcutil
也可以工作,只要生成的 WSDL 被展平。
我可以通过执行以下操作来实现它
- 我在控制台应用程序中托管服务。
- 我添加了一个端点,其中添加了
IContractBehavior
,将所需的参数传递给 IContractBehavior
class。
- 服务开启后,我使用WsdlExporter导出
Metatadaset
- 最后我使用 WsdlHelper 生成 Wsdl 文件
此处描述
http://www.shulerent.com/2013/03/14/generating-a-single-flattened-wsdl-from-an-existing-wcf-service/
代码
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");
}
}
}
我有一个带有 class 的 WCF 服务,它实现了 IContractBehavior
和 IWsdlExportExtension
,它生成一个包含用户允许的操作的 WSDL,并排除他们无权访问的操作和类型.
然而,这样做的局限性在于,对于每个用户,我必须手动更改为哪个用户生成 WSDL。
例如,我想通过将用户作为元数据请求的一部分传入来修复此限制。
localhost/service.svc?user=me
或localhost:9766/service.svc?singleWsdl&user=me
或者我可以使用 svcutil
也可以工作,只要生成的 WSDL 被展平。
我可以通过执行以下操作来实现它
- 我在控制台应用程序中托管服务。
- 我添加了一个端点,其中添加了
IContractBehavior
,将所需的参数传递给IContractBehavior
class。 - 服务开启后,我使用WsdlExporter导出
Metatadaset
- 最后我使用 WsdlHelper 生成 Wsdl 文件
此处描述
http://www.shulerent.com/2013/03/14/generating-a-single-flattened-wsdl-from-an-existing-wcf-service/
代码
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");
}
}
}