如何将SOAP请求发送到WCF服务?

时间:2009-10-29 01:17:15

标签: wcf

任何人都可以向我们举例说明如何将SOAP请求发布到WCF服务并返回SOAP响应吗?基本上,Travel客户端发送带有搜索参数的SOAP请求,WCF服务在数据库中进行检查,然后发送适当的假期。

我继续使用我使用的方法收到此错误:“远程服务器返回错误:(400)错误请求”

5 个答案:

答案 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标头
  • 请求包装在SOAP信封中的内容。

长版本(示例)

让我们以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-8SOAPAction: 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