Что может вызвать ошибку ссылки на объект при использовании BizTalk для использования конечной точки WCF?

Я на другой стороне интеграции с BizTalk 2009, и у меня есть довольно простой контракт, который выглядит примерно так:

[ServiceContract(Name = "ReceiverService", Namespace = "http://services.company.org/")]
public interface IReceiverService : ILoadBalanced
{
 [OperationContract]
 void FinishedRouting(long applicationId);

 [OperationContract]
 void ResponsePending(long applicationId, string stringId, short count);

 [OperationContract]
 void ReportException(long applicationId, string errorMessage, string stringId);

 [OperationContract]
 void SaveResponse(WebResponseDto decision);
}

Однако, когда группа BizTalk пытается использовать мастер использования службы WCF, он подавляется и предоставляет следующую трассировку стека:

[5096] System.NullReferenceException: Object reference not set to an instance of an object. 
[5096]    at Microsoft.BizTalk.Adapter.Wcf.Consuming.Exporters.BindingInfoExporter.CreatePrimaryTransport(ServiceEndpoint serviceEndpoint, Boolean custom) 
[5096]    at Microsoft.BizTalk.Adapter.Wcf.Consuming.Exporters.BindingInfoExporter.CreateSendPort(ServiceEndpoint endpoint, Port port, Boolean custom) 
[5096]    at Microsoft.BizTalk.Adapter.Wcf.Consuming.Exporters.BindingInfoExporter.Export(ServiceEndpointCollection endpoints, ServiceDescriptionCollection wsdlDocuments, Boolean custom) 
[5096]    at Microsoft.BizTalk.Adapter.Wcf.Consuming.Consumer.CreateBindingFiles(MetadataSet metadataSet, String serviceName) 

И снова здесь:

[5096] System.NullReferenceException: Object reference not set to an instance of an object. 
[5096]    at Microsoft.BizTalk.Adapter.Wcf.Consuming.Implementation.ClientImplementation.AddFilesToProject(String schemaNamespace) 
[5096] System.NullReferenceException: Object reference not set to an instance of an object. 
[5096]    at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous) 
[5096]    at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args) 
[5096]    at Microsoft.BizTalk.Adapter.Wcf.Consuming.Consumer.Consume(ISynchronizeInvoke synchronizeInvoke, DTE dte, MetadataSet metadataSet, Project project, String importNamespace) 

Кто-нибудь знает, с чего начать?


person Brandon Linton    schedule 14.09.2010    source источник


Ответы (2)


Это может быть похоже на эти - здесь и здесь, а именно:

  • Используйте svcutil.exe и / или wsdl.exe для своего клиента WCF, чтобы убедиться, что прокси-сервер может быть сгенерирован клиентом, отличным от BizTalk.
  • Проверьте весь WSDL, чтобы убедиться, что целевые пространства имен существуют для всех элементов - в вашем экземпляре также не забудьте проверить свой базовый контракт (ILoadBalanced) и ваши объекты (WebResponseDto)

Можете ли вы подтвердить, что можете использовать WCF Consume Wizard в тривиальной службе WCF (без базового интерфейса, одна операция, строковый ввод и строковый возврат)? Если нет, возможно, ваша VS IDE повреждена.

FWIW, возврат void не кажется проблемой - BTS создает следующую схему ответа для операций void

  <xs:element name="GetDataResponse">
    <xs:complexType>
      <xs:sequence />
    </xs:complexType>
  </xs:element>

И размещение интерфейсов контракта и базового контракта в разных пространствах имен тоже было нормально.

Однако добавление несериализуемого свойства в DTO / entity не удалось ни svcutil, ни мастеру BizTalk WCF.

HTH

namespace WcfService1
{
    [ServiceContract(Namespace = "http://someorl.org/ns1")]
    public interface IBase
    {
        [OperationContract]
        void SomeBaseMethod(int value);
    }

    [ServiceContract(Namespace = "http://someorl.org/ns2")]
    public interface IService1 : IBase
    {

        [OperationContract]
        void GetData(int value);

        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);

        // TODO: Add your service operations here
    }


    // Use a data contract as illustrated in the sample below to add composite types to service operations.
    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";

        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }

        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }

        //[DataMember]
        //public XmlDocument NonSerializable
        //{
        //    get;
        //    set;
        //}
    }
}
person StuartLC    schedule 15.09.2010
comment
Спасибо за обстоятельный ответ! В конечном итоге это привело меня к моему ответу ... копаясь в контракте LoadBalanced, был метод WebGet, который в конечном итоге нарушил импорт BizTalk. Тестовый клиент WCF видит это нормально, но ставит рядом с ним маленький красный восклицательный знак ... Я полагаю, BizTalk просто отказывается продолжать работу в этом случае. - person Brandon Linton; 30.09.2010

Клиентские приложения WCF не могут использовать сервисные контракты с односторонними операциями для отправки сообщений в места приема WCF. Операции в клиентском контракте должны быть помечены IsOneWay = false и ReplyAction = ”*”. Единственное исключение - когда вы используете NetMsmqBinding, и в этом случае все операции с клиентским контрактом должны быть односторонними.

person Howard Edidin    schedule 14.09.2010