0

我有一个 WCF REST 服务,它正在接收(POST)一串 base64 编码的 json 数据。当我在 fiddler2 中测试这个时,我得到一个400 bad request error

问题似乎与发布字符串的长度有关,但我没有得到它,因为在网络配置中我将缓冲区和东西设置为应该足够的值。我不知道我的提琴手缓冲区不够,但我想这会很奇怪

在我的测试中,我发现如果请求比实际的完整编码对象短一点,服务实际上会触发所以我猜它与缓冲区有关,但我看不到问题。

我从服务中获取了编码对象作为 get 并尝试将其放回原处,以便正确编码对象

希望有人可以帮助找到解决方案,因为我认为这是我错过的细节。

提琴手调用:

http://Server/WcfSyncDBService/SyncDBService.svc/AddTodoItems/PEFycmF5T2ZJdGVtcyB4bWxucz0iaHR0cDovL3NjaGVtYXMuZGF0YWNvbnRyYWN0Lm9yZy8yMDA0LzA3L1djZlN5bmNEQlNlcnZpY2UiIHhtbG5zOmk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj48SXRlbXM+PENhdGVnb3J5PlJlbWluZGVyPC9DYXRlZ29yeT48RGVzY3JpcHRpb24+UmVtaW5kZXI8L0Rlc2NyaXB0aW9uPjxJZD41PC9JZD48U3VtbWFyeT5UZXN0IDU8L1N1bW1hcnk+PC9JdGVtcz48L0FycmF5T2ZJdGVtcz4=

这是我的代码:

界面:

[OperationContract(Name = "AddTodoItems")]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare,
                  ResponseFormat = WebMessageFormat.Json, UriTemplate = "AddTodoItems/{content}")]
string AddTodoItems(string content);

执行:

public string AddTodoItems(string content)
{
    var ret = String.Empty;
    try
    {
        var data = DecodeFrom64(content);
        ret = "Encoded:<" + content + ">";
        ret = ret + "content:<" + data+">";
        var ms = new MemoryStream(Encoding.UTF8.GetBytes(data));
        var serializer = new DataContractSerializer(typeof(TodoItem[]));
        var todoArray = (TodoItem[])serializer.ReadObject(ms);

        var todoList = todoArray.ToList();

        if (todoList.Count > 0)
        {
            var context = new SyncDBEntities();
            foreach (var item in todoList)
            {
                var dbItem = (from i in context.todo where i.C_id == item.Id select i).First();

                if (dbItem == null ) // insert
                {
                    var itemAdd = new SyncDBmodel.todo();
                    itemAdd.C_id = item.Id;
                    itemAdd.category = item.Category;
                    itemAdd.summary = item.Summary;
                    itemAdd.description = item.Description;
                    context.AddTotodo(itemAdd);
                    context.SaveChanges();
                }
                else // update
                {
                    dbItem.C_id = item.Id;
                    dbItem.category = item.Category;
                    dbItem.summary = item.Summary;
                    dbItem.description = item.Description;
                    context.SaveChanges();
                }
            }
        }

    }
    catch (Exception e)
    {
        ret = ret+"Error:<"+e.Message+">";
        ret = ret + "InnerException:<" + e.InnerException + ">";
    }
    finally
    {
        if (String.IsNullOrEmpty(ret))
            ret = "OK";
    }
    return ret;
}

public bool DelTodoItems(string content)
{
    bool ret = true;
    try
    {
        var ms = new MemoryStream(Encoding.UTF8.GetBytes(content));
        var serializer = new DataContractSerializer(typeof(TodoItem[]));
        var todoArray = (TodoItem[])serializer.ReadObject(ms);

        var todoList = todoArray.ToList();

        if (todoList.Count > 0)
        {
            var context = new SyncDBEntities();
            foreach (var item in todoList)
            {
                var dbItem = (from i in context.todo where i.C_id == item.Id select i).First();

                if (dbItem != null) // delete
                {
                    context.DeleteObject(dbItem);
                    context.SaveChanges();
                }
            }
        }

    }
    catch (Exception)
    {
        ret = false;
    }
    return ret;
}

网络配置:

<?xml version="1.0"?>
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
        <httpRuntime maxRequestLength="524288" />
    </system.web>
    <system.serviceModel>
        <bindings>
            <webHttpBinding>
                <binding name="StreamedRequestWebBinding"
                         bypassProxyOnLocal="true"
                         useDefaultWebProxy="false"
                         hostNameComparisonMode="WeakWildcard"
                         sendTimeout="10:15:00"
                         openTimeout="10:15:00"
                         receiveTimeout="10:15:00"
                         maxReceivedMessageSize="2147483647"
                         maxBufferSize="2147483647"
                         maxBufferPoolSize="2147483647"
                         transferMode="StreamedRequest">
                    <readerQuotas maxDepth="2147483647"
                                  maxArrayLength="2147483647"
                                  maxStringContentLength="2147483647"
                                  maxBytesPerRead="2147483647"/>
                    <security mode="None"/>
                </binding>
            </webHttpBinding>
        </bindings>
        <services>
            <service name="WcfSyncDBService.SyncDBService" behaviorConfiguration="ServiceBehaviour">
                <endpoint 
                        address ="" 
                        binding="webHttpBinding" 
                        bindingConfiguration="StreamedRequestWebBinding" 
                        contract="WcfSyncDBService.ISyncDBService" 
                        behaviorConfiguration="web">
                </endpoint>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="ServiceBehaviour">
                    <serviceMetadata httpGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
            <endpointBehaviors>
                <behavior name="web">
                    <webHttp/>
                </behavior>
            </endpointBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    </system.serviceModel>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
        <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
            <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
            <dynamicTypes>
                <add mimeType="text/*" enabled="true"/>
                <add mimeType="application/xml" enabled="true" />
                <add mimeType="application/json" enabled="true" />
                <add mimeType="message/*" enabled="true"/>
                <add mimeType="application/javascript" enabled="true"/>
                <add mimeType="*/*" enabled="false"/>
            </dynamicTypes>
            <staticTypes>
                <add mimeType="text/*" enabled="true"/>
                <add mimeType="message/*" enabled="true"/>
                <add mimeType="application/javascript" enabled="true"/>
                <add mimeType="*/*" enabled="false"/>
            </staticTypes>
        </httpCompression>
    </system.webServer>
    <connectionStrings>
        <add name="SyncDBEntities" connectionString="metadata=res://*/SyncDBmodel.csdl|res://*/SyncDBmodel.ssdl|res://*/SyncDBmodel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=SyncDB;Persist Security Info=True;User ID=sa;Password=isql;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
    </connectionStrings>
</configuration>
4

0 回答 0