base64 でエンコードされた json データの文字列を受信 (POST) する WCF REST サービスがあります。これを fiddler2 でテストすると、400 bad request error
問題は投稿された文字列の長さにあるようですが、Web構成でバッファなどを十分な値に設定しているため、わかりません。フィドラーのバッファが十分でないかどうかはわかりませんが、これは奇妙だと思います
私のテストでは、リクエストが実際の完全にエンコードされたオブジェクトよりも少し短い場合、サービスが実際に起動することがわかったので、バッファと関係があると思いますが、問題は見当たりません。
エンコードされたオブジェクトをサービスから 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;
}
Web.config:
<?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="data source=.;initial catalog=SyncDB;Persist Security Info=True;User ID=sa;Password=isql;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>