任何人都可以向我们举例说明如何将SOAP请求发布到WCF服务并返回SOAP响应吗?基本上,Travel客户端发送带有搜索参数的SOAP请求,WCF服务在数据库中进行检查,然后发送适当的假期。
我继续使用我使用的方法收到此错误:“远程服务器返回错误:(400)错误请求”
答案 0 :(得分:1)
您收到的错误是因为服务器不理解HTTP请求。 它可能是您在客户端级别配置的绑定或服务代理不正确。
或者您定义的服务需要HTTP GET而不是HTTP POST。有时,添加服务引用可能无法为某些[WebGet]归因操作生成正确的HTTP谓词。您可能需要手动为客户端的操作添加[WebGet]。
答案 1 :(得分:0)
您没有详细说明服务的距离,因此很难说。
如果这是服务的第一次命中,如果WCF尚未在IIS中正确注册,则可能会发生此错误。特别是.svc扩展需要映射到ASP.NET ISAPI模块。
答案 2 :(得分:0)
要么查看SoapUI,要么找到深埋在Visual Studio文件夹(C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE
)中的 WcfTestClient 。
两者都可以连接到WCF服务并发送/接收SOAP消息。
或者使用svcutil.exe
创建自己的小客户端:
svcutil.exe (service URL)
将为您创建一个小* .cs文件和* .config文件,然后您可以使用它来调用该服务。
马克
答案 3 :(得分:0)
感谢您抽出时间来回答这个问题。 该服务工作正常,如果客户端创建对我的WCF服务的引用并进行方法调用,则会发送相应的响应。
我忘了添加,我的客户端是向我的WCF服务发送HTTP Post请求。 然后创建适当的响应并将其返回给客户端。
我可以阅读HTTP请求,但是当我尝试访问HTTP响应时,我收到错误 - “远程服务器返回错误:(400)错误请求” 强>
代码到达此行时发生错误:
// Get the response.
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
见下面的代码:
private void CreateMessage()
{
// Create a request using a URL that can receive a post.
WebRequest request = WebRequest.Create("http://www.XXXX.com/Feeds");
string postData = "<airport>Heathrow</airport>";
//用户功能 request.Method =“POST”;
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/soap+xml; charset=utf-8";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
// Get the response.
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
// Display the status.
HttpContext.Current.Response.Write(((HttpWebResponse)response).StatusDescription);
// Get the stream containing content returned by the server.
dataStream = response.GetResponseStream();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader(dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd();
// Display the content.
HttpContext.Current.Response.Write(responseFromServer);
// Clean up the streams.
reader.Close();
dataStream.Close();
response.Close();
}
问候
科乔
答案 4 :(得分:0)
从其他.NET应用程序访问WCF服务的推荐方法是使用“连接的服务”参考。下面,我描述如何以更手动的方式创建和发送SOAP请求(不建议用于生产代码)。
您需要:
Content-Type: text/xml; charset=utf-8
标头SOAPAction: http://tempuri.org/YourServiceClass/YourAction
标头让我们以WCF服务应用程序支架为例。
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value);
}
public class Service1 : IService1
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
}
使用Wireshark,我发现请求以默认方式(连接的服务引用)包含Content-Type: text/xml; charset=utf-8
和SOAPAction: http://tempuri.org/IService1/GetData
标头以及以下SOAP信封:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetData xmlns="http://tempuri.org/"> <!-- Action name -->
<value>123</value> <!-- Parameters -->
</GetData>
</s:Body>
</s:Envelope>
使用失眠症,我测试了使请求成功通过的所有条件,因此现在只需将其移植到C#:
// netcoreapp3.1
static async Task<string> SendHttpRequest(string serviceUrl, int value)
{
// Example params:
// serviceUrl: "http://localhost:53045/Service1.svc"
// value: 123
using var client = new HttpClient();
var message = new HttpRequestMessage(HttpMethod.Post, serviceUrl);
message.Headers.Add("SOAPAction", "http://tempuri.org/IService1/GetData"); // url might need to be wrapped in ""
var requestContent = @$"
<s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/"">
<s:Body>
<GetData xmlns=""http://tempuri.org/"">
<value>{value}</value>
</GetData>
</s:Body>
</s:Envelope>
";
message.Content = new StringContent(requestContent, System.Text.Encoding.UTF8, "text/xml");
var response = await client.SendAsync(message);
if (!response.IsSuccessStatusCode)
throw new Exception("Request failed.");
var responseContent = await response.Content.ReadAsStringAsync();
/*
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetDataResponse xmlns="http://tempuri.org/">
<GetDataResult>You entered: {value}</GetDataResult>
</GetDataResponse>
</s:Body>
</s:Envelope>
*/
// Just a really ugly regex
var regex = new Regex(@"(<GetDataResult>)(.*)(<\/GetDataResult>)");
var responseValue = regex.Match(responseContent).Groups[2].Value;
return responseValue;
}
您可以。如果愿意,请使用WebClient
代替HttpClient
。