gpt4 book ai didi

c# - 为什么来自 asp.net c# 应用程序的 Web 服务调用返回 null?

转载 作者:行者123 更新时间:2023-11-30 21:51:27 25 4
gpt4 key购买 nike

在我的应用程序中,我正在使用 Web 服务,并且在调用 Web 服务函数时使用自定义类在带有用户名和密码的 soap 请求 header 中创建 usernametoken。

引用我为制作标题而制作的自定义类:- https://msdn.microsoft.com/en-us/library/ms730868(v=vs.110).aspx

但是当我使用 xmlns:wsse 时出现内部错误,当我将 xmlns:o 用于 <security> 时 header 中的标记我得到空响应。

如果我在配置中添加用户名和密码作为相同的应用程序工作正常

<headers>
<wsse:Security mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>username</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</headers>

我想更改对同一 Web 服务的不同调用的用户名和密码,所以我使用自定义类并生成 header ,不幸的是它变成了 wcf auhtentication,其中安全标记如下所示:-

      <o:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<o:Username></o:Username>
<o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"></o:Password>
</o:UsernameToken>

这会为我的函数调用返回 null。知道如何让它工作吗?任何建议将不胜感激。

注意:据说 Microsoft .net 已弃用 wse 并更新为 wcf 身份验证。但它适用于配置文件中的 wsse 和用户名和密码,但是我无法更改 web 服务中不同函数调用的用户名和密码。

我初始化 web 服务和调用方法的代码如下:-

  string endpointUri = @"https://my endpoint url";
var endpoint = new System.ServiceModel.EndpointAddress(endpointUri);

// Create binding using HTTPS
var securityElement = System.ServiceModel.Channels.SecurityBindingElement.CreateUserNameOverTransportBindingElement();
securityElement.IncludeTimestamp = true;
securityElement.EnableUnsecuredResponse = true;
securityElement.DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic256;
securityElement.MessageSecurityVersion = MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10;
var encodingElement = new System.ServiceModel.Channels.TextMessageEncodingBindingElement(System.ServiceModel.Channels.MessageVersion.Soap11, System.Text.Encoding.UTF8);
var transportElement = new System.ServiceModel.Channels.HttpsTransportBindingElement();
transportElement.MaxReceivedMessageSize = 20000000;
var binding = new System.ServiceModel.Channels.CustomBinding(securityElement, encodingElement, transportElement);
QTWebSvcsClient client = new QTWebSvcsClient(binding, endpoint);

//==========================================================================================================================

client.ChannelFactory.Endpoint.Behaviors.Remove<ClientCredentials>();
client.ChannelFactory.Endpoint.Behaviors.Add(new MyClientCredetnials());
client.ClientCredentials.UserName.UserName = userName + "@" + comp;
client.ClientCredentials.UserName.Password = password;

getDriverDetailsRequest request = new getDriverDetailsRequest();
request.driverId = "Driver1";

getDriverDetailsResponse response = new getDriverDetailsResponse();
response.getDriverDetailsReturn = client.getDriverDetails(request.driverId);

它向我的代码返回 null 并且我在此处引用 null 对象时出现异常

Console.WriteLine(response.getDriverDetailsReturn.driverName);

最佳答案

我决定不遵循困难的方法,而是我可以实现我的真正要求 - 通过程序动态更改网络安全凭证。

我只是使用了在您向 C# 应用程序添加 Web 服务引用时自动创建的配置文件代码。

然后在我起诉的代码中

BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
CustomBinding customBinding = new CustomBinding(binding);
SecurityBindingElement element = customBinding.Elements.Find<SecurityBindingElement>();
element.IncludeTimestamp = false;
EndpointAddress epadd = new EndpointAddress("https://mycompany.ca:113/tracsWebWS/services/TWebSvcs");
TWebSvcsClient client = new TWebSvcsClient(customBinding, epadd);
client.ClientCredentials.UserName.UserName = userName;
client.ClientCredentials.UserName.Password = password;

然后通过 web 服务调用函数给了我正在寻找的答案。

感谢所有帮助我提出建议的人。

关于c# - 为什么来自 asp.net c# 应用程序的 Web 服务调用返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35630668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com