gpt4 book ai didi

c# - 如何在 C# 中将命名空间添加到 soap 信封

转载 作者:行者123 更新时间:2023-11-30 17:28:03 27 4
gpt4 key购买 nike

我想将命名空间设置添加到我的 soap 信封中。我想在 IClientMessageInspector 的 BeforeSendRequest 中更改它,或者您有更优雅的方法。

例如

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<wsa:To xmlns="http://www.w3.org/2005/08/addressing">ws://xxx/V1</wsa:To>
...
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
</s:Body>
</s:Envelope>

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://www.w3.org/2005/08/addressing">
...

请帮帮我!

谢谢!

最佳答案

根据您的描述,我认为您可以使用 WCF Message Inspector。在客户端发送消息之前。我们可以自定义消息正文。
https://learn.microsoft.com/en-us/dotnet/framework/wcf/samples/message-inspectors
我做了一个demo,希望对你有用。
服务器端。

class Program
{

static void Main(string[] args)
{
Uri uri = new Uri("http://localhost:1500");
BasicHttpBinding binding = new BasicHttpBinding();
binding.TransferMode = TransferMode.Buffered;
binding.Security.Mode = BasicHttpSecurityMode.None;
ServiceHost sh = new ServiceHost(typeof(Calculator),uri);
sh.AddServiceEndpoint(typeof(ICalculator), binding, "");
ServiceMetadataBehavior smb;
smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb == null)
{
smb = new ServiceMetadataBehavior();
//smb.HttpGetEnabled = true;
sh.Description.Behaviors.Add(smb);
}
Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "MEX");


sh.Open();
Console.Write("Service is ready....");
Console.ReadLine();
sh.Close();
}
}
[ServiceContract]
public interface ICalculator
{
[OperationContract,WebGet]
double Add(double a, double b);

}

public class Calculator : ICalculator
{
public double Add(double a, double b)
{
return a + b;
}

}

客户端。

class Program
{
static void Main(string[] args)
{
ServiceReference2.CalculatorClient client = new ServiceReference2.CalculatorClient();
try
{
var result = client.Add(34, 20);
Console.WriteLine(result);
}
catch (Exception)
{
throw;
}
}

}
public class ClientMessageLogger : IClientMessageInspector
{
public void AfterReceiveReply(ref Message reply, object correlationState)
{
string result = $"server reply message:\n{reply}\n";
Console.WriteLine(result);
}

public object BeforeSendRequest(ref Message request, IClientChannel channel)
{

XmlDocument doc = new XmlDocument();
MemoryStream ms = new MemoryStream();
XmlWriter writer = XmlWriter.Create(ms);
request.WriteMessage(writer);
writer.Flush();
ms.Position = 0;
doc.Load(ms);

ChangeMessage(doc);

ms.SetLength(0);
writer = XmlWriter.Create(ms);

doc.WriteTo(writer);
writer.Flush();
ms.Position = 0;
XmlReader reader = XmlReader.Create(ms);
request = System.ServiceModel.Channels.Message.CreateMessage(reader, int.MaxValue, request.Version);
string result = $"client ready to send message:\n{request}\n";
Console.WriteLine(result);
return null;
}
void ChangeMessage(XmlDocument doc)
{
XmlElement element = (XmlElement)doc.GetElementsByTagName("s:Envelope").Item(0);
if (element != null)
{
element.SetAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
element.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
}
}
}
public class CustContractBehaviorAttribute : Attribute, IContractBehavior, IContractBehaviorAttribute
{
public Type TargetContract => typeof(ICalculator);

public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
return;
}

public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.ClientMessageInspectors.Add(new ClientMessageLogger());
}

public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
return;
}

public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{
return;
}
}

不要忘记将 CustContractbehavior 应用于服务接口(interface)。

    [CustContractBehavior]
public interface ICalculator {

结果。 enter image description here

关于c# - 如何在 C# 中将命名空间添加到 soap 信封,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53706539/

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