C#调用webservice wsdl实例

时间: 2023-08-15 admin 互联网

C#调用webservice wsdl实例

C#调用webservice wsdl实例

在C#程序中调用webservice的接口,如果java或其他语言开发的,要请注意调用的方法 ,需要用soap 来调用

但如果webservice是用JAVA或者其它语言或者其它工具生成的话,使用vs+c#来调用就经常遇到问题;就是使用上面的方法显得很不好使,经常是使用SOAP UI调用没有问题,但使用上面的方法却调用报错,经常是500的错误。当你联系webservice提供商时通常会说SOAP UI都能调用得到,你们用代码为啥子调用不到,问题出在你们的调用方法上。

在我们向其它公司提供webservice的时候,经常也会出现这样的问题,以前我们一直都以为SOAP UI能够调用,那么代码也就一定能够调用得通,但经过实践,我们自己写DEMO调用自己的webservice时才发现,并不是别人的调用代码写的有问题,因为我们自己也无法将自己写的webservice调用得通,或者说没有找到正确的方法调用得通。这时我们就要思考是否是SOAP UI能够调用得通的webservice就代码一定调用没有问题呢?或者说SOAP UI调用webservice和代码调用webservice的原理区别到底在哪里呢?

总结一下:

(1)SOAP UI能够调用成功,代码不一定能够调用成功,代码调用成功并且得到返回结果的前提是webservice可以按标准返回结果,但SOAP UI是只要按信封返回就可以收到结果而不管结果是否标准;

(2)如果webservice的header有用户名和密码的校验,使用SOAP UI可以调用成功并且得到返回结果,但使用上面web引用的方式却不行。对于这种情况,有以下方法可以调用成功:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Web.Services;
using System.IO;
using System.Net;


namespace mywsdl
{
    public partial class Form1 : Form
    {
        // :9999/Service/test?wsdl

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }


        public static string GetSOAPReSource(string url, string datastr)
        {
            try
            {
                //request
                Uri uri = new Uri(url);
                WebRequest webRequest = WebRequest.Create(uri);
                //webRequest.ContentType = "application/soap+xml; charset=utf-8";
                webRequest.ContentType = "text/xml;charset=utf-8";
                webRequest.Method = "POST";
                using (Stream requestStream = webRequest.GetRequestStream())
                {
                    byte[] paramBytes = Encoding.UTF8.GetBytes(datastr.ToString());
                    requestStream.Write(paramBytes, 0, paramBytes.Length);
                }
                //response
                WebResponse webResponse = webRequest.GetResponse();
                using (StreamReader myStreamReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
                {
                    string result = "";
                    return result = myStreamReader.ReadToEnd();
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            StringBuilder soap = new StringBuilder();

            soap.Append("<soapenv:Envelope xmlns:soapenv=\"/\" xmlns:web=\"/\">");
            soap.Append("<soapenv:Header/>");
            soap.Append("<soapenv:Body>");
            soap.Append("<web:test>");
            soap.Append("<!--Optional:-->");
            soap.Append("<arg0>"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+"</arg0>");
            soap.Append("</web:test>");
            soap.Append("</soapenv:Body>");
            soap.Append("</soapenv:Envelope>");


            string url = ":9999/Service/test?wsdl";
            var result = GetSOAPReSource(url, soap.ToString());
        }



    }
}