How to use the HttpWebRequest object and the HttpWebResponse object to modify the urn:schemas:mailheader:subject property in Visual C# (313126)



The information in this article applies to:

  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET (2003)
  • Microsoft Visual C# .NET (2002)
  • Microsoft Exchange 2000 Server

This article was previously published under Q313126

SUMMARY

This article describes how to use the HttpWebRequestobject and the HttpWebResponseobject from the "System.Net" namespace to modify the urn:schemas:mailheader:subject property for an item in Microsoft Exchange 2000 Server in Microsoft Visual C#.

MORE INFORMATION

To modify the urn:schemas:mailheader:subject property for an item in Visual C#, follow these steps:
  1. Start Microsoft Visual Studio .NET or Microsoft Visual Studio 2005.
  2. On the File menu, point to New, and then click Project.
  3. In the Visual C# Projects typeslist, click Console Application.

    Note In Visual Studio 2005, click Console Application in the Visual C# list.

    n Visual Studio .NET, Class1.cs is created by default. In Visual Studio 2005, Program.cs is created by default.
  4. In the code window, replace the code with the following:
    using System;
    using System.Net;
    using System.IO;         
    
    namespace WebDavNET
    {
       /// <summary>
       /// Summary description for Class1.
       /// </summary>
       class Class1
       {
          static void Main(string[] args)
          {
             try 
             {
                // TODO: Replace with the URL of an object in Exchange Server
                string sUri = "http://ExchServer/Public/MyFolder/Test.EML";
    
                System.Uri myUri = new System.Uri(sUri);
                HttpWebRequest HttpWRequest = (HttpWebRequest)WebRequest.Create(myUri);
    
                string sQuery;
                sQuery = "<?xml version='1.0'?>" + 
                   "<a:propertyupdate xmlns:a='DAV:' " + 
                   "xmlns:m='urn:schemas:mailheader:'>" + 
                   "<a:set><a:prop>" + 
                   "<m:subject>" + "ModifiedSubject" + "</m:subject>" +
                   "</a:prop></a:set>" + 
                   "</a:propertyupdate>";
    
                // Set Credentials
                // TODO: Replace with appropriate user credential
                NetworkCredential myCred = new NetworkCredential(@"DomainName\UserName", "Password");
                CredentialCache myCredentialCache = new CredentialCache();
                myCredentialCache.Add(myUri, "Basic", myCred);
                HttpWRequest.Credentials = myCredentialCache;
            
                //Uncomment the following statement and comment the previous 4 statements if you 
                //use Integrated Windows authentication
                //httpWRequest.Credentials = CredentialCache.DefaultCredentials
    
                //Note In Basic type authentication, the username and the password are sent as base64-encoded text, which is 
                //easily decoded. Microsoft recommends that you use Basic over SSL to help protect the username and the password.
    
                // Set Headers
                HttpWRequest.KeepAlive = false;
                HttpWRequest.Headers.Set("Pragma", "no-cache");
                HttpWRequest.Headers.Set("Translate", "f");
                HttpWRequest.ContentType =  "text/xml";
                HttpWRequest.ContentLength = sQuery.Length;
    
                //set the request timeout to 5 min.
                HttpWRequest.Timeout = 300000;
                // set the request method
                HttpWRequest.Method = "PROPPATCH";
    
                // You must store the data in a byte array
                byte[] ByteQuery = System.Text.Encoding.ASCII.GetBytes(sQuery);
                HttpWRequest.ContentLength = ByteQuery.Length;
                Stream QueryStream = HttpWRequest.GetRequestStream();
                // Write the data to be posted to the Request Stream
                QueryStream.Write(ByteQuery,0,ByteQuery.Length);
                QueryStream.Close();
    
                // Send Request and Get Response
                HttpWebResponse HttpWResponse = (HttpWebResponse)HttpWRequest.GetResponse();
                
                // Get the Status code
                int iStatCode =  (int)HttpWResponse.StatusCode;
                string sStatus = iStatCode.ToString();
                Console.WriteLine("Status Code: {0}", sStatus);
                // Get the request headers
                string sReqHeaders = HttpWRequest.Headers.ToString();
                Console.WriteLine(sReqHeaders);
    
                // Read the Response Stream
                Stream strm = HttpWResponse.GetResponseStream();
                StreamReader sr = new StreamReader(strm);
                string sText = sr.ReadToEnd();
                Console.WriteLine("Response: {0}", sText);
    
                // Close Stream
                strm.Close();
    
                // Clean Up
                myCred = null;
                myCredentialCache = null;
                HttpWRequest = null;
                HttpWResponse = null;
                QueryStream = null;
                strm = null;
                sr = null;      
             }
             catch (Exception e)
             {
                Console.WriteLine("{0} Exception caught.", e);
             }
          }
       }
    
    }
  5. Search for TODO in the code, and then modify the code for your environment.
  6. Build and then run the program.
  7. Make sure that the subject of the specified item has been modified.

Modification Type:MinorLast Reviewed:10/4/2006
Keywords:kbMsg kbXML kbcode kbhowto KB313126 kbAudDeveloper