【问题标题】:Posting XML to Web service in .NET C# and recieving response在 .NET C# 中将 XML 发布到 Web 服务并接收响应
【发布时间】:2013-02-04 13:31:54
【问题描述】:

我正在使用 C# 将 XML 文件发布到 Web 服务,但是当我请求响应“服务器错误 - 500 - 您不允许访问系统”时出现错误。任何帮助将不胜感激。

protected void Page_Load(object sender, EventArgs e)
    {
        WebRequest req = null;
        WebResponse rsp = null;
        try
        {
            string fileName = Server.MapPath("~\\test.xml");
            string uri = "http://212.170.239.71/appservices/http/FrontendService";
            req = WebRequest.Create(uri);
            //req.Proxy = WebProxy.GetDefaultProxy(); // Enable if using proxy
            req.Credentials = new NetworkCredential("myusername", "mypassword");
            req.Method = "POST";        // Post method
            req.ContentType = "text/xml";     // content type
            // Wrap the request stream with a text-based writer
            StreamWriter writer = new StreamWriter(req.GetRequestStream());
            // Write the XML text into the stream
            writer.WriteLine(this.GetTextFromXMLFile(fileName));
            writer.Close();
            // Send the data to the webserver
            rsp = req.GetResponse(); //I am getting error over here
            StreamReader sr = new StreamReader(rsp.GetResponseStream());
            string result = sr.ReadToEnd();
            sr.Close();
            Response.Write(result);

        }
        catch (WebException webEx)
        {
            Response.Write(webEx.Message.ToString());
            Response.Write(webEx.StackTrace.ToString());
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message.ToString());
            Response.Write(ex.StackTrace.ToString());
        }
        finally
        {
            if (req != null) req.GetRequestStream().Close();
            if (rsp != null) rsp.GetResponseStream().Close();
        }
    }
        //Function to read xml data from local system
  /// <summary>
  /// Read XML data from file
  /// </summary>
  /// <param name="file"></param>
  /// <returns>returns file content in XML string format</returns>
  private string GetTextFromXMLFile(string file)
  {
   StreamReader reader = new StreamReader(file);
   string ret = reader.ReadToEnd();
   reader.Close();
   return ret;
  }

【问题讨论】:

  • 如果是 Web 服务,您可以使用 WSDL 生成所有客户端代码。使与它的接口变得更加容易
  • 能否在解决方案资源管理器中右键单击项目并单击添加服务引用,放入服务的端点,单击执行,选择命名空间,然后单击确定?
  • 它是 SOAP Web 服务吗?如果是这样,那么您需要使用“添加服务引用”。
  • 一些提示:您的 WebResponse、StreamReader 和 StreamWriter 都需要在 using 块中。另外,使用ex.ToString() 而不是显示Message 和StackTrace。您将丢失任何 InnerException 实例。

标签: c# asp.net web-services


【解决方案1】:

500 错误来自服务本身,这意味着您没有必要的访问权限,该消息看起来像是自定义的并由服务的编写者返回,因此看起来您正在点击它并获得一个回应,但也许你的凭据是错误的?代码看起来正确 - 我要检查的第一件事是您传入的用户名和密码绝对正确。

【讨论】:

  • 显然我还没有权限对其他帖子发表评论:) 但在回答与服务相关的消息时:您尝试访问的服务似乎是一个 java servlet,并且以他们描述的方式将其添加为项目引用,您需要生成一个 WSDL 文件,这是一个类似 xml 的模式文件,它告诉 .Net 它如何与服务交互。您需要从 servlet 的创建者那里获得 WSDL,有一些工具可以为 Java 生成 WSDL,但我认为它们不是 100% 准确的。我会检查我上面提到的凭据,因为这对我来说似乎是个问题。
【解决方案2】:

我遇到了同样的问题,通过设置代理解决了。这是我的示例工作代码,它可能会对某人有所帮助:)

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(WebRequestPath);
                myReq.Method = "POST";
                myReq.ContentType = "text/xml; encoding=utf-8";
                myReq.Timeout = 180000;
                myReq.KeepAlive = true;
                myReq.Headers.Add("SOAPAction", "http://tempuri.org/AmaliPostData");
                myReq.Accept = "gzip,deflate";
                byte[] PostData = Encoding.UTF8.GetBytes(xmlString.Trim());
                myReq.UseDefaultCredentials = false;
                NetworkCredential cred;
                cred = new NetworkCredential(WebRequestUname, WebRequestPassword);
                myReq.Credentials = cred;
                myReq.Host = WebRequestHost.Trim();
                myReq.Credentials = new System.Net.NetworkCredential(WebRequestUname, WebRequestPassword);
                myReq.PreAuthenticate = true;
                string SetProxy;
                SetProxy = WebRequestProxy; // something like this... "10.2.0.1:8080";
                var proxyObject = new WebProxy(SetProxy);
                myReq.Proxy = proxyObject;
                try
                {
                    var writer = myReq.GetRequestStream();
                    writer.Write(PostData, 0, PostData.Length);
                    writer.Close();
  }
                catch (Exception ex)
                {
                    WriteLog(" Writer Exception " + ex.Message + ex.InnerException + " host : " + myReq.Host);
                }

                HttpWebResponse response = (HttpWebResponse)myReq.GetResponse();
                string resp;
                using (var responseStream = response.GetResponseStream())
                {
                    using (var sr = new StreamReader(responseStream))
                    {
                        resp = sr.ReadToEnd();
                    }
                }

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    相关资源
    最近更新 更多