I succeeded to do MPPS (N-CREATE and N-SET) after many attempts and digging in google, the below link have helped me.
public MessageContent MPPS_Set_StartInPogress(string P_uid)
{
var client = new DicomClient();
var dataset = new DicomDataset();
MessageContent msgContent = new MessageContent();
try
{
//query MWL by patient id
var retCFindResponse = QueryMWL(P_uid);
DicomSequence sq = retCFindResponse.Dataset.Get<DicomSequence>(DicomTag.ScheduledProcedureStepSequence);
DicomDataset content = new DicomDataset();
// get study instance UID from MWL query resault
string studyInstanceUID = retCFindResponse.Dataset.Get<string>(DicomTag.StudyInstanceUID, DicomUID.Generate().ToString()); ;
DicomUID instanceDicomUid = DicomUID.Generate();
DicomUID sopDicomUid = DicomUID.Generate();
// set Attribute Sequence data
content.Add(DicomTag.StudyInstanceUID, studyInstanceUID);
content.Add(DicomTag.ReferencedStudySequence, new DicomDataset());
content.Add(DicomTag.AccessionNumber,retCFindResponse.Dataset.Get<string>(DicomTag.AccessionNumber, String.Empty));
content.Add(DicomTag.RequestedProcedureID,retCFindResponse.Dataset.Get<string>(DicomTag.RequestedProcedureID, String.Empty));
content.Add(DicomTag.RequestedProcedureDescription, retCFindResponse.Dataset.Get<String>(DicomTag.RequestedProcedureDescription,String.Empty));
content.Add(DicomTag.ScheduledProcedureStepID, sq.Items[0].Get<String>(DicomTag.ScheduledProcedureStepID, String.Empty));
content.Add(DicomTag.ScheduledProcedureStepDescription, sq.Items[0].Get<String>(DicomTag.ScheduledProcedureStepID, String.Empty));
content.Add(DicomTag.ScheduledProtocolCodeSequence, new DicomDataset());
DicomSequence attr_Sequence = new DicomSequence(DicomTag.ScheduledStepAttributesSequence, content);//"Scheduled Step Attribute Sequence"
dataset.Add(attr_Sequence);
dataset.Add(DicomTag.PatientName, retCFindResponse.Dataset.Get<string>(DicomTag.PatientName, String.Empty));
dataset.Add(DicomTag.PatientID, retCFindResponse.Dataset.Get<string>(DicomTag.PatientID, String.Empty));
dataset.Add(DicomTag.PatientBirthDate, retCFindResponse.Dataset.Get<string>(DicomTag.PatientBirthDate, String.Empty));
dataset.Add(DicomTag.PatientSex, retCFindResponse.Dataset.Get<string>(DicomTag.PatientSex, String.Empty));
dataset.Add(DicomTag.ReferencedPatientSequence, new DicomDataset());
dataset.Add(DicomTag.PerformedProcedureStepID, "1.2.3.4.5.6"); // can be any key
dataset.Add(DicomTag.PerformedStationAETitle, "UNKNOWN");
dataset.Add(DicomTag.PerformedStationName, "UNKNOWN");
dataset.Add(DicomTag.PerformedLocation, string.Empty);
dataset.Add(DicomTag.PerformedProcedureStepStartDate, DateTime.Now);
dataset.Add(DicomTag.PerformedProcedureStepStartTime, DateTime.Now);
// set status
dataset.Add(DicomTag.PerformedProcedureStepStatus, "IN PROGRESS");
dataset.Add(DicomTag.PerformedProcedureStepDescription, string.Empty);
dataset.Add(DicomTag.PerformedProcedureTypeDescription, string.Empty);
dataset.Add(DicomTag.PerformedProcedureStepEndDate, string.Empty);
dataset.Add(DicomTag.PerformedProcedureStepEndTime, string.Empty);
// get modality from MWL query resault
dataset.Add(DicomTag.Modality, sq.Items[0].Get<String>(DicomTag.Modality, String.Empty));
dataset.Add(DicomTag.StudyID, string.Empty);
dataset.Add(DicomTag.PerformedProtocolCodeSequence, new DicomDataset());
dataset.Add(DicomTag.PerformedSeriesSequence, new DicomDataset());
// I used the studyInstanceUID as the effectedinstamceUid, this id will be needed for the N-SET also
DicomUID effectedinstamceUid = new DicomUID(studyInstanceUID, "effectedinstamceUid", DicomUidType.SOPInstance);// = new DicomDataset();
var dicomStart = new DicomNCreateRequest(DicomUID.ModalityPerformedProcedureStepSOPClass, effectedinstamceUid)
{
Dataset = dataset
};
dicomStart.OnResponseReceived += (req, response) =>
{
if (!(response.Equals(null)))
{
Debug.WriteLine(response);
//msgContent is a class object that has 2 string Status and Message for the return mpps message
msgContent.Status = response.Status.ToString();
msgContent.Message = response.ToString();
}
};
client.AddRequest(dicomStart);
client.Send(ServerHost, ServerPort, false, ClientAET, ServerAET);
}
#region handle exceptions
catch (DicomAssociationRejectedException assRejected)
{
Debug.WriteLine(assRejected);
msgContent.Status = "Rejected";
msgContent.Message = assRejected.Message;
}
catch (DicomAssociationAbortedException assAborted)
{
Debug.WriteLine(assAborted);
msgContent.Status = "Aborted";
msgContent.Message = assAborted.Message;
}
catch (SocketException sEx)
{
Debug.WriteLine(sEx);
msgContent.Status = "Socket_Exception";
msgContent.Message = sEx.Message;
}
catch (Exception ex)
{
Debug.WriteLine(ex);
msgContent.Status = "Exception";
msgContent.Message = ex.Message;
}
#endregion
return msgContent;
}