0

我有一种情况,我想在另一个电话进来时拨打 WCF 电话。

Site1 request--> Site2
Site2 request --> Site3
Site2 <-- Site3 response
Site1 <-- Site2 response

我遇到的问题是,当 Site2 尝试向 Site3 发送消息而 Site1 正在发送到 Site2 时;Site2 说它找不到 Site3。

实际的错误信息是:

Could not find endpoint element with name 'Endpoint_IEchoService' and contract 
'FakeCompany.API.Services.Contract.IEchoService' in the ServiceModel client 
configuration section. This might be because no configuration file was found 
for your application, or because no endpoint element matching this name could be 
found in the client element.

每个站点都是相同的配置和代码库。客户端、代理和服务器都在同一个项目中。这些应用程序是相互调用的克隆。它是一个具有多个地址绑定的网站。在我尝试通话中的通话之前,站点之间的其他常规通话工作正常。

正如您可能从联系人姓名中猜到的那样,在我的 echo 服务中并没有发生太多复杂的事情。站点之间的单个回声呼叫有效。我的问题是当我在服务端对另一个站点进行级联调用时。

我想知道这是不允许的还是需要更改配置设置。

一些代码和配置。

端点地址在运行时更改。
如果你看到一些“时髦”的东西,那是因为客户端、代理和服务继承自通用基类。

//-- 服务模型客户端

<endpoint address="http://FakeCompany.unittest/Services/EchoService.svc"
 binding="basicHttpBinding" bindingConfiguration="SecureBinding"
 contract="FakeCompany.API.Services.Contract.IEchoService" name="Endpoint_IEchoService">
    <identity>
        <servicePrincipalName value="host/mikev-ws" />
    </identity>
</endpoint>

//-- 绑定

<bindings>
    <basicHttpBinding>
        <binding name="SecureBinding" 
                 maxReceivedMessageSize="10000000" 
                 sendTimeout="00:05:00">
            <security mode="TransportCredentialOnly">
                <transport clientCredentialType="Basic" />
            </security>
        </binding>
    </basicHttpBinding>
</bindings>

//-- 行为

<behaviors>
    <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors">
            <serviceMetadata httpGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
    </serviceBehaviors>
</behaviors>

// - 服务

<service name="FakeCompany.API.Services.Service.EchoService" behaviorConfiguration="MyServiceTypeBehaviors">
    <endpoint address="" binding="basicHttpBinding" contract="FakeCompany.API.Services.Contract.IEchoService" bindingConfiguration="SecureBinding" />
</service>

// - 测试

[Test]
public void CascadeMessage()
{
    //-- TEST: That a wcf call can occur within another wcf call.

    //-- ARRANGE
    DTO_Echo_Cascade_Request request = new DTO_Echo_Cascade_Request(unit1, unit2);
    request.NextCall = string.Format("{0};{1};{2};", unit3, unit4, unit5);


    //-- ACT
    var response = EchoAgent.Cascade(request);

    //-- ASSERT
    Assert.AreEqual("TBA", response.Response);
}

// - 代理人

internal static DTO_Echo_Response Cascade(DTO_Echo_Cascade_Request request)
{
    DTO_Echo_Response response;
    using (EchoServiceClient serviceClient = new EchoServiceClient(request))
    {
        response = serviceClient.Cascade(request);
    }

    return response;
}

// - 客户

public DTO_Echo_Response Cascade(DTO_Echo_Cascade_Request request)
{
    return Process(() => Proxy.Cascade(request));
}

合同、DTO、代理被省略。

// - 服务

public DTO_Echo_Response Cascade(DTO_Echo_Cascade_Request request)
{
    DTO_Echo_Response response = new DTO_Echo_Response();

    response.Response += string.Format("Hello from {0};", request.TargetAddress);

    if (request.NextCall.NotNullOrEmpty())
    {
        var split = request.NextCall.Split(new [] {';'}, StringSplitOptions.RemoveEmptyEntries);

        if (split.GetUpperBound(0) > 0)
        {
            DTO_Echo_Cascade_Request nextRequest = new DTO_Echo_Cascade_Request(request.TargetAddress, split[0]);
            for (int i = 1; i < split.GetUpperBound(0); i++)
            {
                nextRequest.NextCall += split[i] + ";";
            }
            response.Response += EchoAgent.Cascade(nextRequest).Response;
        }

    }

    return response;
}

异常发生在以下行

response.Response += EchoAgent.Cascade(nextRequest).Response;
4

0 回答 0