Search code examples
c#jsonazure-devopsdotnet-httpclient

Adding Attachment using API for Visual Studio Team Services (was Visual Studio Online)


I am in the process of creating a simple winform application, which can create new bug items into my Visual Studio Team Services agile workflow, using the API provided. The API Documentation

Currently it can create a new bug, with title, tags and description.

I want to be able to add file attachments, but for some reason this is not working.

The code to create the bug is below

    private static void createInitailItemPostObject()
    {                                           
        AddUpdateProp("/fields/System.Title", newTaskItem.Title);
        AddUpdateProp("/fields/System.Tags", newTaskItem.Tags);
        AddUpdateProp("/fields/System.Description", newTaskItem.Description);
        AddUpdateProp("/fields/System.History", "Upload first file");      
    }

    private static void AddUpdateProp( string field, string value)
    {            
        DataObjectsProject.VSOJasonWorkItemPostData wiPostData = new DataObjectsProject.VSOJasonWorkItemPostData();
        wiPostData.op = "add";
        wiPostData.path = field;
        wiPostData.value = value;
        wiPostDataArr.Add(wiPostData);           
    }

The JSon call is done with the below code

 public static async void Post(string url, System.Net.Http.HttpContent wiPostDataContent, string returnType, JSONReturnCallBack callBack)
    {
       string responseString = String.Empty;
       try
       {
            using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient())
            {

                client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

              
                client.DefaultRequestHeaders.Authorization = 
                             new AuthenticationHeaderValue("Basic",Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", username, password))));


                  using (System.Net.Http.HttpResponseMessage response = client.PostAsync(url, wiPostDataContent).Result)
                  {
                        response.EnsureSuccessStatusCode();
                        string ResponseContent = await response.Content.ReadAsStringAsync();

                        responseString = ResponseContent;

                  }
            }
        }
        catch(Exception ex)
        {
                        Console.WriteLine(ex.ToString());
                        Console.ReadLine();
        }
       callBack(responseString,returnType);
    }

To add an attachment I can't seem to get it to convert the below code to work like my current code.

function readBlob() {
    var files = document.getElementById('fileselect').files;
    if (!files.length) {
        alert('Please select a file!');
        return;
    }
    var file = files[0];
    var filename = file.name;
    var reader = new FileReader();
    reader.onloadend = function (evt) {
        if (evt.target.readyState == FileReader.DONE) {
            // Post file content to server
            $.ajax({
                url: "http://fabrikam.visualstudio.com/DefaultCollection/_apis/wit/attachments?filename=" + filename + "&api-version=1.0",
                data: evt.target.result,
                processData: false,
                contentType: "application/json",
                type: "POST"
            });
        }
    };
    reader.readAsArrayBuffer(file);
}

Has anyone else been able to do this?

The URL I am using is the below url to call the API

"https://[ACCOUNT].visualstudio.com/DefaultCollection/[Project]/_apis/wit/attachments?fileName=Test&api-version=1.0"


Solution

  • As you can see in the example code, you don't need to put the project in the URL for the API call. Try doing it with the following url:

    "https://[ACCOUNT].visualstudio.com/DefaultCollection/_apis/wit/attachments?fileName=Test&api-version=1.0"