#c# #asp.net #wcf #asmx
#c# #asp.net #wcf #asmx
Вопрос:
Я обновляю веб-службу моих клиентов с устаревшего ASP.NET ASMX и и Microsoft.Сетевая библиотека WSE для более новой реализации WCF. Но у меня недостаточно документов, чтобы знать, нужно ли мне передавать URL, такой как приведенный ниже код?
В старом стиле URL-адрес наблюдался откуда-то из библиотеки веб-службы, и в новом вызове мне пришлось ввести URL-адрес для подключения и создания фабрики каналов. Мне просто интересно, можно ли обойти URL-адрес, как в старом стиле?
Вот старый код
_TrustCurrentWebServices = new WebServiceAWI();
_User = new User();
_User.UserName = _TrustCurrentWebServices.EncryptValue(_BPWebServicesUserName);
_User.Password = _TrustCurrentWebServices.EncryptValue(_BPWebServicesPassword);
Hre — это новый код. Я не хочу передавать URL-адрес!
var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
var endpoint = new EndpointAddress(_Url);
var channelFactory = new ChannelFactory<WebServiceAWI>(binding, endpoint);
_WebServiceAWI = channelFactory.CreateChannel();
_User = new User();
_User.UserName = _WebServiceAWI.EncryptValue(_BPWebServicesUserName);
_User.Password = _WebServiceAWI.EncryptValue(_BPWebServicesPassword);
Я пытался
var channelFactory = new ChannelFactory<WebServiceAWI>(binding);
но получил исключение, в котором говорилось, что мне нужен адрес конечной точки!
Ответ №1:
При вызове службы путем создания канала с помощью ChannelFactory вы можете обратиться к следующим фрагментам кода, чтобы настроить учетные данные клиента.
Server end(10.157.13.69, Console app)
static void Main(string[] args)
{
Uri uri = new Uri("https://localhost:11011");
BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential;
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
using (ServiceHost sh = new ServiceHost(typeof(MyService), uri))
{
sh.AddServiceEndpoint(typeof(IService), binding, "");
ServiceMetadataBehavior smb;
smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb == null)
{
smb = new ServiceMetadataBehavior()
{
HttpsGetEnabled = true
};
sh.Description.Behaviors.Add(smb);
}
sh.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = System.ServiceModel.Security.UserNamePasswordValidationMode.Custom;
sh.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new CustUserNamePasswordVal();
Binding mexbinding = MetadataExchangeBindings.CreateMexHttpsBinding();
sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");
sh.Opened = delegate
{
Console.WriteLine("Service is ready");
};
sh.Closed = delegate
{
Console.WriteLine("Service is clsoed");
};
sh.Open();
Console.ReadLine();
sh.Close();
Console.ReadLine();
}
}
}
[ServiceContract]
public interface IService
{
[OperationContract]
string SayHello();
}
public class MyService : IService
{
public string SayHello()
{
return $"Hello Stranger,{DateTime.Now.ToLongTimeString()}";
}
}
internal class CustUserNamePasswordVal : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
if (userName != "jack" || password != "123456")
{
throw new Exception("Username/Password is not correct");
}
}
}
Вызов клиента.
ServicePointManager.ServerCertificateValidationCallback = delegate
{
return true;
};
BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential;
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
ChannelFactory<IService> factory = new ChannelFactory<IService>(binding, new EndpointAddress("https://10.157.13.69:11011"));
factory.Credentials.UserName.UserName = "jack";
factory.Credentials.UserName.Password = "123456";
IService sv = factory.CreateChannel();
try
{
var result = sv.SayHello();
Console.WriteLine(result);
}
catch (Exception)
{
throw;
}
https://learn.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-use-the-channelfactory
https://learn.microsoft.com/en-us/dotnet/api/system.servicemodel.channelfactory-1?redirectedfrom=MSDNamp;view=netframework-4.7.2
Не стесняйтесь, дайте мне знать, если я могу чем-нибудь помочь.