wcf 相关问题

Windows Communication Foundation是.NET Framework的一部分,它为快速构建面向服务的应用程序提供了统一的编程模型。

如何更改 WCf 服务的 wsdl 文件中的默认 schemalocation?

以下是我的服务的wsdl文件: 以下是我的服务的wsdl文件: <wsdl:types> <xsd:schema targetNamespace="http://tempuri.org/Imports"> <xsd:import schemaLocation="http://localhost:3789/VideoUpload.svc?xsd=xsd0" namespace="http://tempuri.org/" /> <xsd:import schemaLocation="http://localhost:3789/VideoUpload.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> <xsd:import schemaLocation="http://localhost:3789/VideoUpload.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/UploadVideoProtocol" /> </xsd:schema> </wsdl:types> ----- <wsdl:definitions> <wsdl:service name="VideoUpload"> <wsdl:port name="BasicHttpBinding_IVideoUpload" binding="tns:BasicHttpBinding_IVideoUpload"> <soap:address location="http://localhost:3789/VideoUpload.svc" /> </wsdl:port> </wsdl:service> </wsdl:definitions> 在上面,我可以通过在服务契约和行为中的代码内指定自定义命名空间来更改命名空间。 但是我需要更改架构位置中指定的端点地址, schemaLocation =“http://localhost:3789/VideoUpload.svc?xsd=xsd0” 我自己定义的端点地址为: schemaLocation =“http://myservice.com:8080/VideoUpload.svc?xsd=xsd0” 实现这一目标的程序是什么?代码中必须提及什么才能更改生成的默认端点?有人可以帮我解决这个问题吗? 您可以通过添加实现“IWsdlExportExtension”的新行为来动态更新 WSDL 元数据中的 WCF 端点地址 public class HostNameAddressBehavior : Attribute, IWsdlExportExtension, IEndpointBehavior, IServiceBehavior { public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { } public void Validate(ServiceEndpoint endpoint) { } public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { } public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { } public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { } public void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context) { } /// <summary> /// Overwrite service meta data /// </summary> /// <param name="exporter"></param> /// <param name="context"></param> public void ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context) { var address = "YOUR_ENDPOINT"; context.Endpoint.Address = new System.ServiceModel.EndpointAddress(address); XmlSchemaSet schemaSet = exporter.GeneratedXmlSchemas; foreach (System.Web.Services.Description.ServiceDescription wsdl in exporter.GeneratedWsdlDocuments) { foreach (XmlSchema schema in wsdl.Types.Schemas) { ChangeSchemaLocation(schemaSet, schema, address); } } } /// <summary> /// Update XSD location /// </summary> /// <param name="xmlSchemaSet"></param> /// <param name="xsdDoc"></param> /// <param name="address"></param> private void ChangeSchemaLocation(XmlSchemaSet xmlSchemaSet, XmlSchema xsdDoc, string address) { foreach (XmlSchemaExternal external in xsdDoc.Includes) { if ((external != null) && string.IsNullOrEmpty(external.SchemaLocation)) { string str = (external is XmlSchemaImport) ? ((XmlSchemaImport)external).Namespace : xsdDoc.TargetNamespace; foreach (XmlSchema schema in xmlSchemaSet.Schemas(str ?? string.Empty)) { if (schema != xsdDoc) { external.SchemaLocation = address + "/?xsd=xsd0"; // set the location; break; } } continue; } } } } 通过代码或配置文件添加新行为。 通过代码: var endpoint = listener.ServiceHost.Description.Endpoints.First(); endpoint.Behaviors.Add(new HostNameAddressBehavior()); 或 按配置: 创建扩展: public class HostNameAddressBehaviorExtension : BehaviorExtensionElement { public override Type BehaviorType { get { return typeof(HostNameAddressBehavior); } } protected override object CreateBehavior() { return new HostNameAddressBehavior(); } } 然后添加: <extensions> <behaviorExtensions> <add name="hostNameAddress" type="YourService.HostNameAddressBehaviorExtension, YourService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> </behaviorExtensions> </extensions>

回答 1 投票 0

如何增加.net core 2.1项目中WCF服务的超时值

我发布此内容是因为我无法在 Stack Overflow 上找到任何位置通过连接服务添加服务引用来解决使用 WCF 的 .Net-Core 项目的此问题...

回答 4 投票 0

增加 C# 中 WCF Web 服务的超时

我目前有一个应用程序正在调用服务器上的 Web 服务进行搜索。我们预计会返回大量数据,因此搜索时间超过一分钟是很常见的。 ...

回答 6 投票 0

用于连接到 ASP.NET Web 服务的 WCF 客户端

我有一个包含 ASMX Web 服务的项目和一个使用客户端代理连接到它的桌面客户端(使用来自 ASM Web 服务的 WSDL)。 使用 svc 实用程序升级代理以生成 WCF 服务...

回答 1 投票 0

WCF 触发并忘记异常处理

我想在现有的 WebAPI 服务中实现“即发即忘”任务。下面的代码只是发送一个日志事件(可能是客户端已连接到服务以执行某些任务......

回答 1 投票 0

WCF 更新客户端证书后,我们收到身份验证错误:证书链已正确处理,但其中一个 CA 证书不可信

客户端证书(来自商业 CA)由于过期而被更改,并且与一项服务的通信停止运行 - 我们在服务器跟踪上收到以下错误 System.IdentityModel.Tokens.

回答 1 投票 0

使用 WCF 和 HTTP 将 C# 字典序列化为 JSON 对象

我是使用 HTTP 路由的 WCF 服务的新手,但我的新项目使用 WCF。服务返回标有 [DataContract] 和 [DataMember] 属性的对象,作为标记为 w...的服务的一部分返回...

回答 1 投票 0

如何从 WCF REST 方法将自定义类型值的字典作为常规 JSON 对象返回?

假设我有一个如下所示的自定义类型: [数据合同] 公共类复合类型 { [数据成员] public bool 已支付 { 得到; 放; } [数据成员] ...

回答 1 投票 0

为 http 和 https 端点配置 WCF 4 的路由 (global.asax)

我仍然是 wcf 的新手,总体上对 .net 不太了解。我有一个 WCF 4 Web 服务,它使用 global.asax 路由方法,并使用标准 en...

回答 2 投票 0

在事务中调用 WCF 方法会导致错误

我有一个复杂的应用程序并遇到了错误。我用以下代码简化了我的实际问题。 我有一个 WCF 服务,其方法可以对我的一个表执行选择: 公共圣...

回答 1 投票 0

调用 SOAP 时,“底层连接已关闭:预期保持活动状态的连接已被服务器关闭”

在调用另一个 WSDL 服务时,有时会出现错误“底层连接已关闭:预期保持活动状态的连接已被服务器关闭”。 我使用.Net 4.5 WCF 服务...

回答 1 投票 0

WCF 实现 IErrorHandler 遇到注册扩展“enforceGreetingFaults”无法加载

我有一个旧的WCF项目,它接收xml类型的调用后。 最近,呼叫者称他们在拨打我们的端点时遇到 500。 但当我们检查日志时,并没有与...相关的记录

回答 1 投票 0

我们能让 ASP.NET Core REST API 同时支持 JSON 和 SOAP 吗?

我想制作一个同时支持json和soap的REST API。我尝试了 SoapCore nuget 包,但收到如下错误: IEndpointRoutebuilder 不包含“UseSoapEndpoint an...”的定义

回答 1 投票 0

将Soap请求体绑定到net core中的c#

我有以下 SOAP 请求正文。我需要 C# 类来绑定数据。 我有以下 C# 类,但它不起作用。 [XmlRoot(ElementName = "品牌")] 公共课品牌 { [XmlAttr...

回答 1 投票 0

使用依赖解析器与 autofac wcf 集成

我正在开发一个wcf项目并使用autofac,它正在工作。 但是,我的要求是我将在不同的系统上部署此服务,并且它需要使用预...

回答 1 投票 0

WCF - 发布 JSON 对象

我正在尝试将 JSON 发布到 WCF 服务。 json 对象包含一个数组。我想知道如何正确绑定到我的数据合同。如果有人可以在这里给我指点,我将非常感激......

回答 1 投票 0

OData $filter,其中包含 $expand 中的项目

我提供了一些网络服务来访问信息。 我要做的第一件事就是尝试扩展一个节点。我已经用以下代码成功完成了这一点 http://www.domain.com/ODataService/

回答 6 投票 0

使用命名管道获取 ProcessID 的安全方法

我有一个由 GUI 和服务组成的应用程序。它们在同一台计算机上运行,并通过 WCF 通过命名管道进行通信。 我试图从服务中获取

回答 1 投票 0

WCF 以编程方式设置标头

每次我调用 wcf 服务时,我都需要以编程方式设置标头, 在我的示例中,我必须设置身份节点的所有节点(Identity、AppName、AppKey、UserId、IdentityProvider) 每次我调用 wcf 服务时,我都需要以编程方式设置标头, 在我的示例中,我必须设置身份节点的所有节点(Identity、AppName、AppKey、UserId、IdentityProvider) <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://.../services"> <soapenv:Header> <Identity xmlns="http://.../"> <AppName>test1</AppName> <AppKey>test2</AppKey> <UserId>test3</UserId> <IdentityProvider>test4</IdentityProvider> </Identity> </soapenv:Header> <soapenv:Body> 我已阅读这篇文章如何向每个 WCF 调用添加自定义 HTTP 标头?但它似乎不完整,我正在寻找完整的示例。 使用下面的代码 MessageHeader myHeader0 = MessageHeader.CreateHeader( "Identity", "http:asd.com", ""); MessageHeader myHeader1 = MessageHeader.CreateHeader( "AppName","" , "test1"); MessageHeader myHeader2 = MessageHeader.CreateHeader( "AppKey", "", "test2"); MessageHeader myHeader3 = MessageHeader.CreateHeader( "UserId", "", "test3"); MessageHeader myHeader4 = MessageHeader.CreateHeader( "IdentityProvider", "", "test4"); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader0); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader1); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader2); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader3); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader4); 如果是响应对象,则在WCF的接口代码中添加: public class Service1 : IService1 { public string GetData(int value) { MessageHeader myHeader0 = MessageHeader.CreateHeader( "Identity", "http:asd.com", ""); MessageHeader myHeader1 = MessageHeader.CreateHeader( "AppName","" , "test1"); MessageHeader myHeader2 = MessageHeader.CreateHeader( "AppKey", "", "test2"); MessageHeader myHeader3 = MessageHeader.CreateHeader( "UserId", "", "test3"); MessageHeader myHeader4 = MessageHeader.CreateHeader( "IdentityProvider", "", "test4"); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader0); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader1); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader2); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader3); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader4); return string.Format("You entered: {0}", value); } 如果是请求对象,则在客户端调用中添加以下代码: WS.ServiceClient myclient = new WS.ServiceClient(); using (OperationContextScope scope=new OperationContextScope(myclient.InnerChannel)) { MessageHeader myHeader0 = MessageHeader.CreateHeader( "Identity", "http:asd.com", ""); MessageHeader myHeader1 = MessageHeader.CreateHeader( "AppName","" , "test1"); MessageHeader myHeader2 = MessageHeader.CreateHeader( "AppKey", "", "test2"); MessageHeader myHeader3 = MessageHeader.CreateHeader( "UserId", "", "test3"); MessageHeader myHeader4 = MessageHeader.CreateHeader( "IdentityProvider", "", "test4"); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader0); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader1); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader2); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader3); OperationContext.Current.OutgoingMessageHeaders.Add(myHeader4); myclient.GetData(1); }

回答 1 投票 0

xml.LoadData 根级别的数据无效,第 1 行,位置 1。现有解决方案没有帮助

我正在尝试将我从字符串构建的 xml 文件保存到 C# Web 服务应用程序的 App_Data 中的本地内存中。尽管查看了以前的堆栈解决方案,我还是收到此错误: 达...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.