首页 > 解决方案 > Master Data Services 使用 WCF 服务创建实体成员

问题描述

我正在尝试使用 WCF 服务创建实体成员。

但是线

EntityMembersCreateResponse createResponse = clientProxy.EntityMembersCreate(createRequest);

引发以下错误:

mscorlib.dll 中出现“System.ServiceModel.Security.SecurityNegotiationException”类型的未处理异常

附加信息:调用者未经服务验证。**

有人可以帮我吗?

我使用以下代码:

using System;
using System.Collections.Generic;

using System.Linq;
using System.Text;
using System.Threading.Tasks;

// additional references...
using System.ServiceModel;
using System.Collections.ObjectModel;
using SAP_to_MDS.MDSTestService; // For the created service reference.


namespace SAP_to_MDS
{
    class MDSConnector
    {

        // MDS service client proxy object. 
        private static ServiceClient clientProxy;

        // Set the MDS URL (plus /Service/Service.svc) here. 
        public static string mdsURL = @"http://myhost/MDS/service/Service.svc";

        public static void Connect() {

            Identifier modelId = null;
                       
            string model = "PDM";
            string entity = "Werks";

            // "VERSION_1" is a default version name for a new model. 
            string version = "VERSION_1";
          
            try
            {
                // Create a service proxy. 
                clientProxy = GetClientProxy(mdsURL);
                clientProxy.ClientCredentials.UserName.UserName = "mydomain\\user";
                clientProxy.ClientCredentials.UserName.Password = "mypassword";
                Console.WriteLine("Connected...");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error creating a service proxy: {0}", ex);
                return;
            }

            // Create an entity member (leaf member) with a specified name, code, and member type.
            string leafMemberCode = "Code" + Guid.NewGuid().ToString("N");
            string leafMemberName = "Name" + Guid.NewGuid().ToString("N");
            // CreateEntityMember(model, version, entity, leafMemberName, leafMemberCode, MemberType.Leaf);
            createEntityMember("PDM", "Version_1", "Werks", "Number", "1", MemberType.Leaf);

            Console.ReadKey();

        }

        // Creates MDS service client proxy.
        private static ServiceClient GetClientProxy(string targetURL)
        {
            // Create an endpoint address using the URL. 
            EndpointAddress endptAddress = new EndpointAddress(targetURL);

            // Create and configure the WS Http binding. 
            WSHttpBinding wsBinding = new WSHttpBinding();

            // Create and return the client proxy. 
            return new ServiceClient(wsBinding, endptAddress);
        }

        
        // Create an entity member with a specified name, code, and member type.
        private static void createEntityMember(string modelName, string version, string entityName, string newName, string newCode, MemberType memberType)
        {
            EntityMembersCreateRequest createRequest = new EntityMembersCreateRequest();
            createRequest.Members = new EntityMembers();
            createRequest.ReturnCreatedIdentifiers = true;
            createRequest.Members.ModelId = new Identifier { Name = modelName };
            createRequest.Members.VersionId = new Identifier { Name = version };
            createRequest.Members.EntityId = new Identifier { Name = entityName };
            createRequest.Members.MemberType = memberType;
            createRequest.Members.Members = new System.Collections.ObjectModel.Collection<Member> { };
            Member newMember = new Member();
            newMember.MemberId = new MemberIdentifier() { Name = newName, Code = newCode, MemberType = memberType };

            createRequest.Members.Members.Add(newMember);
           
            EntityMembersCreateResponse createResponse = clientProxy.EntityMembersCreate(createRequest);
            //HandleErrors(createResponse.OperationResult);

        }


    }
}

标签: c#wcfsql-server-2016master-data-services

解决方案


通过使用 NTLM 身份验证解决了该问题:

clientProxy.ClientCredentials.Windows.AllowNtlm=true;
clientProxy.ClientCredentials.Windows.ClientCredential.Domain = "mydomain";
clientProxy.ClientCredentials.Windows.ClientCredential.UserName = "username";
clientProxy.ClientCredentials.Windows.ClientCredential.Password = "mypassword";

推荐阅读