在.NETC#中将XML发布到Web服务并接收响应

在.NETC#中将XML发布到Web服务并接收响应,c#,asp.net,web-services,C#,Asp.net,Web Services,我正在使用C#将XML文件发布到Web服务,但当我请求响应“服务器错误-500-不允许您访问系统”时,我遇到了错误。任何帮助都将不胜感激 protected void Page_Load(object sender, EventArgs e) { WebRequest req = null; WebResponse rsp = null; try { string fileName = Server.

我正在使用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;
  }
受保护的无效页面加载(对象发送方,事件参数e)
{
WebRequest-req=null;
WebResponse rsp=null;
尝试
{
字符串文件名=Server.MapPath(“~\\test.xml”);
字符串uri=”http://212.170.239.71/appservices/http/FrontendService";
req=WebRequest.Create(uri);
//req.Proxy=WebProxy.GetDefaultProxy();//如果使用代理,则启用
请求凭证=新网络凭证(“我的用户名”、“我的密码”);
req.Method=“POST”//POST方法
req.ContentType=“text/xml”;//内容类型
//使用基于文本的编写器包装请求流
StreamWriter writer=新的StreamWriter(req.GetRequestStream());
//将XML文本写入流中
WriteLine(这个.GetTextFromXMLFile(文件名));
writer.Close();
//将数据发送到Web服务器
rsp=req.GetResponse();//这里有个错误
StreamReader sr=新的StreamReader(rsp.GetResponseStream());
字符串结果=sr.ReadToEnd();
高级关闭();
响应。写入(结果);
}
捕获(WebException webEx)
{
Write(webEx.Message.ToString());
Write(webEx.StackTrace.ToString());
}
捕获(例外情况除外)
{
Response.Write(例如Message.ToString());
Write(例如StackTrace.ToString());
}
最后
{
如果(req!=null)req.GetRequestStream().Close();
如果(rsp!=null)rsp.GetResponseStream().Close();
}
}
//函数从本地系统读取xml数据
/// 
///从文件中读取XML数据
/// 
/// 
///以XML字符串格式返回文件内容
私有字符串GetTextFromXMLFile(字符串文件)
{
StreamReader=新的StreamReader(文件);
string ret=reader.ReadToEnd();
reader.Close();
返回ret;
}

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

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


如果它是一个web服务,您可以使用WSDL生成所有客户端代码。使与它的交互更加容易您可以在解决方案资源管理器中右键单击该项目并单击“添加服务引用”,为您的服务输入端点,单击“转到”,选择名称空间,然后单击“确定”吗?它是SOAP web服务吗?如果是这样,那么您需要使用“添加服务引用”。一些提示:您的WebResponse、StreamReader和StreamWriter都需要使用
块。另外,使用
ex.ToString()
代替显示
消息
堆栈跟踪
。您将丢失任何
InnerException
实例。显然,我还没有在其他帖子上发表评论的权限:)但作为对服务相关消息的回答:您尝试访问的服务似乎是一个java servlet,如果要以它们描述的方式将其添加为项目引用,您需要生成一个WSDL文件,这是一个类似xml的模式文件,告诉.Net如何与服务交互。您需要从servlet的创建者那里获得WSDL,有一些工具可以为Java生成WSDL,但我认为它们不是100%准确。我会检查我上面提到的证书,因为这对我来说似乎是个问题。
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();
                    }
                }